<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bome</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bome"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Bome"/>
	<updated>2026-04-15T21:49:57Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107906</id>
		<title>Benutzer:Bome</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107906"/>
		<updated>2026-02-27T14:58:15Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Projektseiten auf &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-Computer: bo8h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-CPU: bo8]]&lt;br /&gt;
&lt;br /&gt;
Homepage und Kontaktdaten: https://bo8h.de &amp;lt;br /&amp;gt;&lt;br /&gt;
Besuchen Sie auch https://sedimal.de&lt;br /&gt;
&lt;br /&gt;
Kontaktierung über &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/user/show/bome&lt;br /&gt;
&lt;br /&gt;
Forenbeiträge mit Bezug zum Projekt&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/244442 8bit-Rechner auf Spartan-3A-Starterkit]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/304134 Tester gesucht ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dazu: [[Eine Alternative zur while-Schleife]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/250009 Hexadezimaler Ziffernsatz]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/7292010 Hex-Ziffern auf 7-Segment-Anzeigen]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/2781885 Warum ist das Zoll ...]&lt;br /&gt;
&lt;br /&gt;
Was mir sonst noch wichtig ist&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://freigeisterhaus.de/viewtopic.php?p=2186553#2186553 freigeisterhaus.de/Bewusstsein-ManyWorlds]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.politik-forum.eu/viewtopic.php?f=19&amp;amp;t=48768&amp;amp;start=300#p4480607 www.politik-forum.eu/Was-ist-Bewusstsein?]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/254701 Viele-Welten-Hypothese]&amp;lt;br /&amp;gt; [https://www.mikrocontroller.net/topic/459906 Neuromorphe Schaltkreise]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.spektrum.de/artikel/1159808 &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Siehe Kommentar #11&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=107904</id>
		<title>Zahlensysteme</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=107904"/>
		<updated>2026-02-24T23:54:49Z</updated>

		<summary type="html">&lt;p&gt;Bome: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
In der Programmierung werden vier Zahlensysteme verwendet:&lt;br /&gt;
&#039;&#039;&#039;dezimal&#039;&#039;&#039;, &#039;&#039;&#039;hexadezimal&#039;&#039;&#039;, &#039;&#039;&#039;oktal&#039;&#039;&#039;, &#039;&#039;&#039;binär&#039;&#039;&#039; (besser: &#039;&#039;&#039;dual&#039;&#039;&#039;).&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
!style=&amp;quot;width:10em;&amp;quot;|  Zahlensystem &lt;br /&gt;
!style=&amp;quot;width:5em;&amp;quot;|  Basis   &lt;br /&gt;
!style=&amp;quot;width:7em;&amp;quot;|  Ziffern&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;nbsp;dezimal       ||&amp;amp;nbsp;10     ||&amp;amp;nbsp;0 .. 9 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;nbsp;hexadezimal   ||&amp;amp;nbsp;16     ||&amp;amp;nbsp;0 .. 9 A .. F&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;nbsp;oktal         ||&amp;amp;nbsp;8      ||&amp;amp;nbsp;0 .. 7&lt;br /&gt;
|-&lt;br /&gt;
|&amp;amp;nbsp;dual          ||&amp;amp;nbsp;2      ||&amp;amp;nbsp;0 .. 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Zahlen 0-15&lt;br /&gt;
&lt;br /&gt;
Eine einstellige Hexadezimalzahl entspricht einer vollständigen, zweistelligen Oktakzahl bzw. vierstelligen Dualzahl. Diese nennt man auch [[Nibble]]. Eine Dezimalzahl braucht dafür 2 Stellen, welche aber nicht voll ausgenutzt werden. Darum ist die Umrechnung von hexadezimal/oktal/dual in dezimal aufwändiger. Die nachfolgende Tabelle sollte jeder Programmierer auswendig kennen, diese ist das kleine 1x1 der Zahlensysteme&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4 style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
!style=&amp;quot;width:5em;&amp;quot;| dezimal &lt;br /&gt;
!style=&amp;quot;width:8em;&amp;quot;| hexadezimal&lt;br /&gt;
!style=&amp;quot;width:3em;&amp;quot;| oktal&lt;br /&gt;
!style=&amp;quot;width:3em;&amp;quot;| dual&lt;br /&gt;
|-&lt;br /&gt;
| 0  || 0 || 0 || 0000&lt;br /&gt;
|-&lt;br /&gt;
| 1  || 1 || 1 || 0001&lt;br /&gt;
|-&lt;br /&gt;
| 2  || 2 || 2 || 0010&lt;br /&gt;
|-&lt;br /&gt;
| 3  || 3 || 3 || 0011&lt;br /&gt;
|-&lt;br /&gt;
| 4  || 4 || 4 || 0100&lt;br /&gt;
|-&lt;br /&gt;
| 5  || 5 || 5 || 0101&lt;br /&gt;
|-&lt;br /&gt;
| 6  || 6 || 6 || 0110&lt;br /&gt;
|-&lt;br /&gt;
| 7  || 7 || 7 || 0111&lt;br /&gt;
|-&lt;br /&gt;
| 8  || 8 || 10 || 1000&lt;br /&gt;
|-&lt;br /&gt;
| 9  || 9 || 11 || 1001&lt;br /&gt;
|-&lt;br /&gt;
| 10 || A || 12 || 1010&lt;br /&gt;
|-&lt;br /&gt;
| 11 || B || 13 || 1011&lt;br /&gt;
|-&lt;br /&gt;
| 12 || C || 14 || 1100&lt;br /&gt;
|-&lt;br /&gt;
| 13 || D || 15 || 1101&lt;br /&gt;
|-&lt;br /&gt;
| 14 || E || 16 || 1110&lt;br /&gt;
|-&lt;br /&gt;
| 15 || F || 17 || 1111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Darstellung ==&lt;br /&gt;
=== Hexadezimal ===&lt;br /&gt;
&#039;&#039;&#039;Hexadezimal&#039;&#039;&#039;zahlen werden meistens (z.&amp;amp;nbsp;B. in [[C]] oder im [[AVR]]-[[Assembler]]) mit dem Prefix &amp;quot;0x&amp;quot; geschrieben, also z.&amp;amp;nbsp;B. 0x3A; auch anzutreffen ist die Schreibweise mit einem führenden &amp;quot;$&amp;quot; (z.&amp;amp;nbsp;B. $3A).&lt;br /&gt;
&lt;br /&gt;
Die vierstellige hexadezimale Schreibweise wird gerne verwendet um zwei [[Digitaltechnik|Bytes]] zusammenzufassen:&amp;lt;br&amp;gt;&lt;br /&gt;
Bsp.: 0x010F =&amp;gt; 01 ist das High Byte, 0F ist das Low Byte.&lt;br /&gt;
&lt;br /&gt;
=== Oktal ===&lt;br /&gt;
&#039;&#039;&#039;Oktal&#039;&#039;&#039;zahlen schreibt man in [[C]] mit einer führenden &amp;quot;0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
C-Programmierer sollten sich die führende Null bei Oktalzahlen unbedingt merken, auch wenn sie keine Oktalzahlen verwenden wollen. Denn es bedeutet, dass man Dezimalzahlen nicht mit führenden Nullen schreiben darf. &amp;quot;64&amp;quot; und &amp;quot;064&amp;quot; sind zwei völlig verschiedene Zahlen. Das erste ist die dezimale Zahl 64, das zweite die oktale Zahl 64, was der dezimalen Zahl 52 entspricht. Das gilt auch für AVR-ASM.&lt;br /&gt;
&lt;br /&gt;
=== Binär ===&lt;br /&gt;
&#039;&#039;&#039;Binär&#039;&#039;&#039;zahlen schreibt man im AVR-Assembler mit &amp;quot;0b&amp;quot; am Anfang, z.&amp;amp;nbsp;B. 0b00110100. In [[C]]-Programmen ist die direkte Eingabe von Binärzahlen nicht möglich, es lassen sich aber [[C Makros|Makros]] zu diesem Zweck schreiben. Einige Compiler verfügen über eine Spracherweiterung, bei der meist der Präfix &amp;quot;0b&amp;quot; für Binärzahlen benutzt wird.&lt;br /&gt;
&lt;br /&gt;
=== Intel-Syntax ===&lt;br /&gt;
[[Assembler]] mit Intel-Syntax (z.&amp;amp;nbsp;B. für 80x86 oder [[8051]]) verwenden dagegen zur Kennzeichnung keinen Präfix sondern einen Postfix. Für Hexzahlen gilt also z.&amp;amp;nbsp;B. die Notation 0A5H, für Oktalzahlen 245O (oder 245Q) und für Binärzahlen dementsprechend 10100101B.&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
=== Anmerkung zu Oktalzahlen ===&lt;br /&gt;
Oktalzahlen sind in der Mikrocontroller-Programmierung heute seltener anzutreffen. Praktisch sind sie vor allem dann, wenn Binärzahlen aus irgend einem Grund in Gruppen von jeweils drei Bit strukturiert sind. Das gilt z.&amp;amp;nbsp;B. für die Datei-Zugriffsrechte unter [[Unix]]/[[Linux]], die sich bequem durch Angabe einer Oktalzahl einstellen lassen (z.&amp;amp;nbsp;B. entspricht &amp;quot;751&amp;quot; dem Bitmuster &amp;quot;111 101 001&amp;quot; oder &amp;quot;rwxr-x--x&amp;quot; in der üblichen Zugriffsrecht-Darstellung.) .&lt;br /&gt;
&lt;br /&gt;
=== Umrechnung ===&lt;br /&gt;
Viele Taschenrechner können die Zahlensysteme umrechnen, so auch der Windows-Taschenrechner oder der UNIX-Taschenrechner bc. Wie die Umrechnung mathematisch funktioniert, ist [http://www.tutorials.at/einfuehrung/03-zahlensysteme.html hier] beschrieben. Zur Umrechnung von Nachkommastellen siehe [https://www.studienservice.de/thema/dezimal-in-hexadezimal.71337/#post-1140103 hier].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Forenthread [https://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems] und Website [https://sedimal.de sedimal.de] mit der Intention der Einführung des hexadezimalen Zahlensystems im Alltag&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107885</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107885"/>
		<updated>2026-02-13T21:47:26Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107842</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107842"/>
		<updated>2026-01-13T13:48:13Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h ist ein Rechner für FPGA-Boards.&lt;br /&gt;
Aktuelle Realisierungen gibt es auf folgenden Boards:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts.&lt;br /&gt;
Merkmale des Gesamtsystems sind der aus acht 64KByte-Seiten bestehende Adressraum,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Der Rechner hat Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC sowie eine SD-Karte.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de/Home/ bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
&lt;br /&gt;
Das Gerät hat 4 freie virtuelle Slots mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Slot-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit, ebenso das Data-Register &#039;&#039;&#039;D&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null ist.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt acht Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  RAM  frei   vorgesehen als TextRAM&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  RAM1  Haupt-RAM&lt;br /&gt;
* Page 3:  RAM2  Neben-RAM&lt;br /&gt;
* Page 4:  Slot4&lt;br /&gt;
* Page 5:  Slot5&lt;br /&gt;
* Page 6:  Slot6&lt;br /&gt;
* Page 7:  Slot7&lt;br /&gt;
&lt;br /&gt;
Die 3bit-Register MP, MX, MY, MZ legen zusammen mit dem 2bit-Register SL fest, in welche der 8 Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. MP, MX, MY, MZ können nur die Werte 0 bis 4 annehmen.&lt;br /&gt;
Wenn der Wert 4 ist, dann liefert SL die unteren 2bit für die Page-Auswahl.&lt;br /&gt;
&lt;br /&gt;
Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für eines der Adressregister&lt;br /&gt;
bewirkt den Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 4 geladen werden,&lt;br /&gt;
das Register SL mit einem Wert 0 bis 3. &lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Bytecode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Bytecode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 4 Slots.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Bytecode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
BORR  ...  UBOR&lt;br /&gt;
BORX  ...  UBOR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch BORR/BORX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Slot-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
BORR  leiht den von einer databox in RAM1 oder RAM2 belegten Speicherplatz an mehrere Variable aus,&lt;br /&gt;
welche vorher als nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
BORX  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
In RAM1 sind die mehreren Variablen kurze Variable vom Typ data, oder selber&lt;br /&gt;
wieder vom Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft BORR/BORX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
UBOR  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, BORR/BORX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, UBOR im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen bilden selber wieder&lt;br /&gt;
einen Block, jedoch können mehrere BORR/BORX-UBOR-Blöcke einander überkreuzen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Startwerte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107838</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107838"/>
		<updated>2026-01-12T21:16:18Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h ist ein Rechner für FPGA-Boards.&lt;br /&gt;
Aktuelle Realisierungen gibt es auf folgenden Boards:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts.&lt;br /&gt;
Merkmale des Gesamtsystems sind der aus acht 64KByte-Seiten bestehende Adressraum,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Der Rechner hat Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC sowie eine SD-Karte.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de/Home/ bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
&lt;br /&gt;
Das Gerät hat 4 freie virtuelle Slots mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Slot-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit, ebenso das Data-Register &#039;&#039;&#039;D&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null ist.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt acht Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  RAM (frei)&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
* Page 4:  Slot4&lt;br /&gt;
* Page 5:  Slot5&lt;br /&gt;
* Page 6:  Slot6&lt;br /&gt;
* Page 7:  Slot7&lt;br /&gt;
&lt;br /&gt;
Die 3bit-Register MP, MX, MY, MZ legen zusammen mit dem 2bit-Register SL fest, in welche der 8 Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. MP, MX, MY, MZ können nur die Werte 0 bis 4 annehmen. Wenn der Wert 4 ist, dann liefert SL die unteren 2bit für die Page-Auswahl.&lt;br /&gt;
&lt;br /&gt;
Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für eines der Adressregister&lt;br /&gt;
bewirkt den Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 4 geladen werden,&lt;br /&gt;
das Register SL mit einem Wert 0 bis 3. &lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Bytecode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Bytecode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 4 Slots.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Bytecode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
BORR  ...  UBOR&lt;br /&gt;
BORX  ...  UBOR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch BORR/BORX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Slot-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
BORR  leiht den von einer databox im Haupt-RRAM oder Zusatz-RAM belegten Speicherplatz an mehrere Variable aus,&lt;br /&gt;
welche vorher als nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
BORX  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Im Haupt-RAM sind die mehreren Variablen kurze Variable vom Typ data, oder selber&lt;br /&gt;
wieder vom Typ databox, im Zusatz-RAM sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft BORR/BORX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
UBOR  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, BORR/BORX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, UBOR im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen bilden selber wieder&lt;br /&gt;
einen Block, jedoch können mehrere BORR/BORX-UBOR-Blöcke einander überkreuzen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Startwerte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107837</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107837"/>
		<updated>2026-01-12T21:03:38Z</updated>

		<summary type="html">&lt;p&gt;Bome: Großer Umbau&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h ist ein Rechner für FPGA-Boards.&lt;br /&gt;
Aktuelle Realisierungen gibt es auf folgenden Boards:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts.&lt;br /&gt;
Merkmale des Gesamtsystems sind der aus acht 64KByte-Seiten bestehende Adressraum,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Der Rechner hat Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC sowie eine SD-Karte.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de/Home/ bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
&lt;br /&gt;
Das Gerät hat 4 freie virtuelle Slots mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Slot-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit, ebenso das Data-Register &#039;&#039;&#039;D&#039;&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null ist.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt acht Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  RAM (frei)&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
* Page 4:  Slot4&lt;br /&gt;
* Page 5:  Slot5&lt;br /&gt;
* Page 6:  Slot6&lt;br /&gt;
* Page 7:  Slot7&lt;br /&gt;
&lt;br /&gt;
Die 3bit-Register MP, MX, MY, MZ legen zusammen mit dem 2bit-Register SL fest, in welche der 8 Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. MP, MX, MY, MZ können nur die Werte 0 bis 4 annehmen. Wenn der Wert 4 ist, dann liefert SL die unteren 2bit für die Page-Auswahl.&lt;br /&gt;
&lt;br /&gt;
Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für eines der Adressregister&lt;br /&gt;
bewirkt den Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 4 geladen werden,&lt;br /&gt;
das Register SL mit einem Wert 0 bis 3. &lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Bytecode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Bytecode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 4 Slots.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Bytecode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
BORR  ...  UBOR&lt;br /&gt;
BORX  ...  UBOR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch BORR/BORX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Slot-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
BORR  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
BORX  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Im Haupt-RAM sind die mehreren Variablen kurze Variable vom Typ data, oder selber&lt;br /&gt;
wieder vom Typ databox, im Zusatz-RAM sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft BORR/BORX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
UBOR  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, BORR/BORX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, UBOR im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen bilden selber wieder&lt;br /&gt;
einen Block, jedoch können mehrere BORR/BORX-UBOR-Blöcke einander überkreuzen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Startwerte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107834</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107834"/>
		<updated>2026-01-12T19:03:17Z</updated>

		<summary type="html">&lt;p&gt;Bome: Neues Register D&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K   D   V               Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A  |   &#039;                             AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   D Data   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx kann auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ST.D   CP.V   NE.U   NE.V   ZO.U   ZO.V   SE.U   SE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.D   GT.D   ZO.A   NE.A   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.D      D &amp;lt;= 0&lt;br /&gt;
ST.D      D &amp;lt;= A&lt;br /&gt;
GT.D      A &amp;lt;= D&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2     P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107702</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107702"/>
		<updated>2025-09-12T23:46:24Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107625</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107625"/>
		<updated>2025-08-12T12:39:02Z</updated>

		<summary type="html">&lt;p&gt;Bome: Schlüsselwörter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, wird man diese Ermittlung in eine Funktion packen mit der Abbruchbedingung als Rückgabewert, und in der Schleife den Rückgabewert abfragen. Es sind jedoch auch Programmiersprachen denkbar, welche anstelle von Funktionen lediglich einfache Unterprogramme mit gleichberechtigten Parametern ohne expliziten Rückgabewert erlauben. Eine Alternative zur while-Schleife, die beliebig umfangreiches Ermitteln der Abbruchbedingung erlaubt, ohne dass man das Ermitteln in eine Funktion auslagern muss, wäre die &#039;&#039;&#039;do-while-Schleife mit Einsprung&#039;&#039;&#039;, deren Schlüsselwörter hier &#039;&#039;&#039;do-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;while&#039;&#039;&#039; heissen sollen. &#039;&#039;&#039;while&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;do-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;do-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
Das ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache mit diesem Schleifentyp?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107620</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107620"/>
		<updated>2025-08-11T18:43:13Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107619</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107619"/>
		<updated>2025-08-11T18:41:49Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|&#039;&#039;bome&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de/Home/ bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107617</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107617"/>
		<updated>2025-08-11T00:46:33Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|bome]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de/Home/ bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107616</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107616"/>
		<updated>2025-08-10T18:48:27Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|bome]]&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107615</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107615"/>
		<updated>2025-08-10T18:30:01Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|bome]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107614</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107614"/>
		<updated>2025-08-10T18:19:58Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|bome]]&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107613</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107613"/>
		<updated>2025-08-10T18:13:45Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Erst-Autor:&#039;&#039; [[Benutzer:Bome|bome]]&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107612</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107612"/>
		<updated>2025-08-10T11:42:08Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([[Benutzer:Bome|bome]])&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107611</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107611"/>
		<updated>2025-08-10T11:39:35Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([[Benutzer:Bome|bome]])&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Meine Website zum Projekt: [https://bo8h.de bo8h.de]&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107610</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107610"/>
		<updated>2025-08-10T00:58:15Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [https://bo8h.de bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107609</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107609"/>
		<updated>2025-08-10T00:53:50Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Meine Website zum Projekt: [https://bo8h.de bo8h.de]&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107608</id>
		<title>Benutzer:Bome</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107608"/>
		<updated>2025-08-10T00:40:31Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Projektseiten auf &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-Computer: bo8h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-CPU: bo8]]&lt;br /&gt;
&lt;br /&gt;
Homepage und Kontaktdaten: https://bo8h.de &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Domain bomerenzprojekt.de habe ich aufgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Besuchen Sie auch https://sedimal.de&amp;lt;br /&amp;gt;&lt;br /&gt;
Offtopic: https://invers-gendern.de&lt;br /&gt;
&lt;br /&gt;
Kontaktierung über &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/user/show/bome&lt;br /&gt;
&lt;br /&gt;
Forenbeiträge mit Bezug zum Projekt&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/244442 8bit-Rechner auf Spartan-3A-Starterkit]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/304134 Tester gesucht ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dazu: [[Eine Alternative zur while-Schleife]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/250009 Hexadezimaler Ziffernsatz]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/7292010 Hex-Ziffern auf 7-Segment-Anzeigen]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/2781885 Warum ist das Zoll ...]&lt;br /&gt;
&lt;br /&gt;
Was mir sonst noch wichtig ist&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://freigeisterhaus.de/viewtopic.php?p=2186553#2186553 freigeisterhaus.de/Bewusstsein-ManyWorlds]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.politik-forum.eu/viewtopic.php?f=19&amp;amp;t=48768&amp;amp;start=300#p4480607 www.politik-forum.eu/Was-ist-Bewusstsein?]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/254701 Viele-Welten-Hypothese]&amp;lt;br /&amp;gt; [https://www.mikrocontroller.net/topic/459906 Neuromorphe Schaltkreise]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.spektrum.de/artikel/1159808 &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Siehe Kommentar #11&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Eine_Alternative_zur_while-Schleife&amp;diff=107577</id>
		<title>Diskussion:Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Eine_Alternative_zur_while-Schleife&amp;diff=107577"/>
		<updated>2025-06-30T03:01:04Z</updated>

		<summary type="html">&lt;p&gt;Bome: Pro-Argument&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ist doch überflüssig wie ein Kropf&lt;br /&gt;
&lt;br /&gt;
Der allseits geschätzte frühere Moderator Karlheinz Buchegger fand die Schleife mit Einsprung immerhin &amp;quot;interessant&amp;quot;:&lt;br /&gt;
https://www.mikrocontroller.net/topic/347716#4046801 --[[Benutzer:Bome|Bome]] ([[Benutzer Diskussion:Bome|Diskussion]]) 03:01, 30. Jun. 2025 (UTC)&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107576</id>
		<title>Benutzer:Bome</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107576"/>
		<updated>2025-06-30T01:36:33Z</updated>

		<summary type="html">&lt;p&gt;Bome: Artikel-Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Projektseiten auf &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-Computer: bo8h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-CPU: bo8]]&lt;br /&gt;
&lt;br /&gt;
Homepage und Kontaktdaten: https://www.bo8h.de &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Domain bomerenzprojekt.de habe ich aufgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Besuchen Sie auch https://sedimal.de&amp;lt;br /&amp;gt;&lt;br /&gt;
Offtopic: https://invers-gendern.de&lt;br /&gt;
&lt;br /&gt;
Kontaktierung über &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/user/show/bome&lt;br /&gt;
&lt;br /&gt;
Forenbeiträge mit Bezug zum Projekt&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/244442 8bit-Rechner auf Spartan-3A-Starterkit]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/304134 Tester gesucht ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dazu: [[Eine Alternative zur while-Schleife]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/250009 Hexadezimaler Ziffernsatz]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/7292010 Hex-Ziffern auf 7-Segment-Anzeigen]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/2781885 Warum ist das Zoll ...]&lt;br /&gt;
&lt;br /&gt;
Was mir sonst noch wichtig ist&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://freigeisterhaus.de/viewtopic.php?p=2186553#2186553 freigeisterhaus.de/Bewusstsein-ManyWorlds]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.politik-forum.eu/viewtopic.php?f=19&amp;amp;t=48768&amp;amp;start=300#p4480607 www.politik-forum.eu/Was-ist-Bewusstsein?]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/254701 Viele-Welten-Hypothese]&amp;lt;br /&amp;gt; [https://www.mikrocontroller.net/topic/459906 Neuromorphe Schaltkreise]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.spektrum.de/artikel/1159808 &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Siehe Kommentar #11&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107554</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107554"/>
		<updated>2025-06-11T11:52:09Z</updated>

		<summary type="html">&lt;p&gt;Bome: textlich verbessert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, wird man diese Ermittlung in eine Funktion packen mit der Abbruchbedingung als Rückgabewert, und in der Schleife den Rückgabewert abfragen. Es sind jedoch auch Programmiersprachen denkbar, welche anstelle von Funktionen lediglich einfache Unterprogramme mit gleichberechtigten Parametern ohne expliziten Rückgabewert erlauben. Eine Alternative zur while-Schleife, die beliebig umfangreiches Ermitteln der Abbruchbedingung erlaubt, ohne dass man das Ermitteln in eine Funktion auslagern muss, wäre die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039;, deren Schlüsselwörter hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen. &#039;&#039;&#039;repeat-if&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;l-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache mit diesem Schleifentyp?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107551</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107551"/>
		<updated>2025-06-10T14:42:36Z</updated>

		<summary type="html">&lt;p&gt;Bome: Link zum Forum&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, wird man diese Ermittlung in eine Funktion packen mit der Abbruchbedingung als Rückgabewert, und in der Schleife den Rückgabewert abfragen. Es sind jedoch auch Programmiersprachen denkbar, welche anstelle von Funktionen lediglich einfache Unterprogramme mit gleichberechtigten Parametern ohne expliziten Rückgabewert erlauben. In diesem Fall bietet sich als Alternative zur while-Schleife die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039; an, deren Schlüsselwörter hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen. &#039;&#039;&#039;repeat-if&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;l-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum&amp;lt;br&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache mit diesem Schleifentyp?]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107550</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107550"/>
		<updated>2025-06-10T12:42:45Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, wird man diese Ermittlung in eine Funktion packen mit der Abbruchbedingung als Rückgabewert, und in der Schleife den Rückgabewert abfragen. Es sind jedoch auch Programmiersprachen denkbar, welche anstelle von Funktionen lediglich einfache Unterprogramme mit gleichberechtigten Parametern ohne expliziten Rückgabewert erlauben. In diesem Fall bietet sich als Alternative zur while-Schleife die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039; an, deren Schlüsselwörter hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen. &#039;&#039;&#039;repeat-if&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;l-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Forenbeitrag dazu:&amp;lt;br&amp;gt;&lt;br /&gt;
https://www.mikrocontroller.net/topic/347716&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107549</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107549"/>
		<updated>2025-06-10T12:41:28Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, wird man diese Ermittlung in eine Funktion packen mit der Abbruchbedingung als Rückgabewert, und in der Schleife den Rückgabewert abfragen . Es sind jedoch auch Programmiersprachen denkbar, welche anstelle von Funktionen lediglich einfache Unterprogramme mit gleichberechtigten Parametern ohne expliziten Rückgabewert erlauben. In diesem Fall bietet sich als Alternative zur while-Schleife die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039; an, deren Schlüsselwörter hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen. &#039;&#039;&#039;repeat-if&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;l-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Forenbeitrag dazu:&amp;lt;br&amp;gt;&lt;br /&gt;
https://www.mikrocontroller.net/topic/347716&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107548</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107548"/>
		<updated>2025-06-10T01:47:22Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, kann man diese Ermittlung in eine Funktion packen und der Funktion die Abbruchbedingung als Ergebnis zuweisen. Es sind jedoch auch Programmiersprachen denkbar, welche anstelle von Funktionen lediglich einfache Unterprogramme mit gleichberechtigten Parametern ohne explizites Ergebnis erlauben. In diesem Fall bietet sich als Alternative zur while-Schleife die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039; an, deren Schlüsselwörter hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;l-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Forenbeitrag dazu:&amp;lt;br&amp;gt;&lt;br /&gt;
https://www.mikrocontroller.net/topic/347716&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107547</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107547"/>
		<updated>2025-06-09T23:43:19Z</updated>

		<summary type="html">&lt;p&gt;Bome: Kategorie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, kann man diese Ermittlung in eine Funktion packen und der Funktion die Abbruchbedingung als Ergebnis zuweisen. Es sind jedoch auch einfache Programmiersprachen denkbar, welche anstelle von Funktionen lediglich Unterprogramme mit gleichberechtigten Parametern ohne explizites Ergebnis erlauben. In diesem Fall bietet sich als Alternative zur while-Schleife die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039; an, deren Schlüsselwörter hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; springt zum Start des Schleifenkörpers. &#039;&#039;&#039;l-jp&#039;&#039;&#039; springt zur Marke &#039;&#039;&#039;there&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Forenbeitrag dazu:&amp;lt;br&amp;gt;&lt;br /&gt;
https://www.mikrocontroller.net/topic/347716&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;br /&gt;
[[Kategorie:Programmiersprachen]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107545</id>
		<title>Eine Alternative zur while-Schleife</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Eine_Alternative_zur_while-Schleife&amp;diff=107545"/>
		<updated>2025-06-09T20:26:26Z</updated>

		<summary type="html">&lt;p&gt;Bome: Schleife mit Einsprung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn bei einer while-Schleife das Ermitteln der Abbruchbedingung sehr umfangreich ist, kann man diese Ermittlung in eine Funktion packen und der Funktion die Abbruchbedingung als Ergebnis zuweisen. Es sind jedoch auch einfache Programmiersprachen denkbar, welche anstelle von Funktionen lediglich Unterprogramme mit gleichberechtigten Parametern ohne explizites Ergebnis beinhalten. In diesem Fall bietet sich als Alternative zur while-Schleife die &#039;&#039;&#039;Schleife mit Einsprung&#039;&#039;&#039; an, deren Schlüsselworte hier &#039;&#039;&#039;l-jp&#039;&#039;&#039; und &#039;&#039;&#039;there&#039;&#039;&#039; und &#039;&#039;&#039;repeat-if&#039;&#039;&#039; heissen sollen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;l-jp&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;there&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;repeat-if&#039;&#039;&#039; x&amp;gt;0&lt;br /&gt;
&lt;br /&gt;
ersetzt die while-Schleife&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;while&#039;&#039;&#039; test&amp;gt;0&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Schleifenkörper&lt;br /&gt;
&lt;br /&gt;
mit der separat vereinbarten Funktion test&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;function&#039;&#039;&#039; test&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; Ermitteln der Abbruchbedingung mit Ergebnis x=0&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;return(&#039;&#039;&#039;x&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Forenbeitrag dazu:&amp;lt;br&amp;gt;&lt;br /&gt;
https://www.mikrocontroller.net/topic/347716&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107512</id>
		<title>Benutzer:Bome</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107512"/>
		<updated>2025-05-16T23:10:57Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Projektseiten auf &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-Computer: bo8h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-CPU: bo8]]&lt;br /&gt;
&lt;br /&gt;
Homepage und Kontaktdaten: https://www.bo8h.de &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Domain bomerenzprojekt.de habe ich aufgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Besuchen Sie auch https://sedimal.de&amp;lt;br /&amp;gt;&lt;br /&gt;
Offtopic: https://invers-gendern.de&lt;br /&gt;
&lt;br /&gt;
Kontaktierung über &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/user/show/bome&lt;br /&gt;
&lt;br /&gt;
Forenbeiträge mit Bezug zum Projekt&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/244442 8bit-Rechner auf Spartan-3A-Starterkit]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/304134 Tester gesucht ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/250009 Hexadezimaler Ziffernsatz]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/7292010 Hex-Ziffern auf 7-Segment-Anzeigen]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/2781885 Warum ist das Zoll ...]&lt;br /&gt;
&lt;br /&gt;
Was mir sonst noch wichtig ist&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://freigeisterhaus.de/viewtopic.php?p=2186553#2186553 freigeisterhaus.de/Bewusstsein-ManyWorlds]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.politik-forum.eu/viewtopic.php?f=19&amp;amp;t=48768&amp;amp;start=300#p4480607 www.politik-forum.eu/Was-ist-Bewusstsein?]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/254701 Viele-Welten-Hypothese]&amp;lt;br /&amp;gt; [https://www.mikrocontroller.net/topic/459906 Neuromorphe Schaltkreise]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.spektrum.de/artikel/1159808 &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Siehe Kommentar #11&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107268</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107268"/>
		<updated>2025-02-03T21:45:06Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107242</id>
		<title>Benutzer:Bome</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107242"/>
		<updated>2025-01-25T16:38:12Z</updated>

		<summary type="html">&lt;p&gt;Bome: Links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Projektseiten auf &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-Computer: bo8h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-CPU: bo8]]&lt;br /&gt;
&lt;br /&gt;
Homepage und Kontaktdaten: https://www.bo8h.de &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Domain bomerenzprojekt.de habe ich aufgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Besuchen Sie auch https://sedimal.de&lt;br /&gt;
&lt;br /&gt;
Kontaktierung über &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/user/show/bome&lt;br /&gt;
&lt;br /&gt;
Forenbeiträge mit Bezug zum Projekt&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/244442 8bit-Rechner auf Spartan-3A-Starterkit]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/304134 Tester gesucht ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/250009 Hexadezimaler Ziffernsatz]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/7292010 Hex-Ziffern auf 7-Segment-Anzeigen]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/2781885 Warum ist das Zoll ...]&lt;br /&gt;
&lt;br /&gt;
Was mir sonst noch wichtig ist&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://freigeisterhaus.de/viewtopic.php?p=2186553#2186553 freigeisterhaus.de/Bewusstsein-ManyWorlds]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.politik-forum.eu/viewtopic.php?f=19&amp;amp;t=48768&amp;amp;start=300#p4480607 www.politik-forum.eu/Was-ist-Bewusstsein?]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.mikrocontroller.net/topic/254701 Viele-Welten-Hypothese]&amp;lt;br /&amp;gt; [https://www.mikrocontroller.net/topic/459906 Neuromorphe Schaltkreise]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.spektrum.de/artikel/1159808 &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Siehe Kommentar #11&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107234</id>
		<title>Benutzer:Bome</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Bome&amp;diff=107234"/>
		<updated>2025-01-20T04:46:34Z</updated>

		<summary type="html">&lt;p&gt;Bome: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Projektseiten auf &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-Computer: bo8h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[8bit-CPU: bo8]]&lt;br /&gt;
&lt;br /&gt;
Homepage und Kontaktdaten: https://www.bo8h.de &amp;lt;br /&amp;gt;&lt;br /&gt;
Die Domain bomerenzprojekt.de habe ich aufgegeben.&amp;lt;br /&amp;gt;&lt;br /&gt;
Besuchen Sie auch https://sedimal.de&lt;br /&gt;
&lt;br /&gt;
Kontaktierung über &#039;&#039;mikrocontroller.net&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/user/show/bome&lt;br /&gt;
&lt;br /&gt;
Forenbeiträge mit Bezug zum Projekt&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/244442 8bit-Rechner auf Spartan-3A-Starterkit]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/304134 Tester gesucht ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/347716 Gibt es eine Programmiersprache ...]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/250009 Hexadezimaler Ziffernsatz]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/7292010 Hex-Ziffern auf 7-Segment-Anzeigen]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems]&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://www.mikrocontroller.net/topic/goto_post/2781885 Warum ist das Zoll ...]&lt;br /&gt;
&lt;br /&gt;
Was mir sonst noch wichtig ist&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://freigeisterhaus.de/viewtopic.php?p=2186553#2186553 freigeisterhaus.de/Bewusstsein-ManyWorlds]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.politik-forum.eu/viewtopic.php?f=19&amp;amp;t=48768&amp;amp;start=300#p4480607 www.politik-forum.eu/Was-ist-Bewusstsein?]&amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/254701 &amp;lt;br /&amp;gt;&lt;br /&gt;
http://www.spektrum.de/artikel/1159808 &amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Siehe Kommentar #11&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=107233</id>
		<title>Zahlensysteme</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Zahlensysteme&amp;diff=107233"/>
		<updated>2025-01-20T03:24:34Z</updated>

		<summary type="html">&lt;p&gt;Bome: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
In der Programmierung werden vier Zahlensysteme verwendet:&lt;br /&gt;
&#039;&#039;&#039;dezimal&#039;&#039;&#039;, &#039;&#039;&#039;hexadezimal&#039;&#039;&#039;, &#039;&#039;&#039;oktal&#039;&#039;&#039;, &#039;&#039;&#039;binär&#039;&#039;&#039; (besser: &#039;&#039;&#039;dual&#039;&#039;&#039;).&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
! Zahlensystem &lt;br /&gt;
! Basis   &lt;br /&gt;
! Ziffern&lt;br /&gt;
|-&lt;br /&gt;
|dezimal       || 10     || 0 .. 9 &lt;br /&gt;
|-&lt;br /&gt;
|hexadezimal   || 16     || 0 .. 9, A .. F&lt;br /&gt;
|-&lt;br /&gt;
|oktal         || 8      || 0 .. 7&lt;br /&gt;
|-&lt;br /&gt;
|dual          || 2      || 0 .. 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Einige Zahlenbeispiele:&lt;br /&gt;
{| border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
!dezimal&lt;br /&gt;
!hexadezimal&lt;br /&gt;
!oktal&lt;br /&gt;
!dual&lt;br /&gt;
|-&lt;br /&gt;
| 0   || 00 || 000 || 00000000&lt;br /&gt;
|-&lt;br /&gt;
| 1   || 01 || 001 || 00000001&lt;br /&gt;
|-&lt;br /&gt;
| 15  || 0F || 017 || 00001111&lt;br /&gt;
|-&lt;br /&gt;
| 100 || 64 || 144 || 01100100&lt;br /&gt;
|-&lt;br /&gt;
| 255 || FF || 377 || 11111111&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Darstellung ==&lt;br /&gt;
=== Hexadezimal ===&lt;br /&gt;
&#039;&#039;&#039;Hexadezimal&#039;&#039;&#039;zahlen werden meistens (z.&amp;amp;nbsp;B. in [[C]] oder im [[AVR]]-[[Assembler]]) mit dem Prefix &amp;quot;0x&amp;quot; geschrieben, also z.&amp;amp;nbsp;B. 0x3A; auch anzutreffen ist die Schreibweise mit einem führenden &amp;quot;$&amp;quot; (z.&amp;amp;nbsp;B. $3A).&lt;br /&gt;
&lt;br /&gt;
Die vierstellige hexadezimale Schreibweise wird gerne verwendet um zwei [[Digitaltechnik|Bytes]] zusammenzufassen:&amp;lt;br&amp;gt;&lt;br /&gt;
Bsp.: 0x010F =&amp;gt; 01 ist das High Byte, 0F ist das Low Byte.&lt;br /&gt;
&lt;br /&gt;
=== Oktal ===&lt;br /&gt;
&#039;&#039;&#039;Oktal&#039;&#039;&#039;zahlen schreibt man in [[C]] mit einer führenden &amp;quot;0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
C-Programmierer sollten sich die führende Null bei Oktalzahlen unbedingt merken, auch wenn sie keine Oktalzahlen verwenden wollen. Denn es bedeutet, dass man Dezimalzahlen nicht mit führenden Nullen schreiben darf. &amp;quot;64&amp;quot; und &amp;quot;064&amp;quot; sind zwei völlig verschiedene Zahlen. Das erste ist die dezimale Zahl 64, das zweite die oktale Zahl 64, was der dezimalen Zahl 52 entspricht. Das gilt auch für AVR-ASM.&lt;br /&gt;
&lt;br /&gt;
=== Binär ===&lt;br /&gt;
&#039;&#039;&#039;Binär&#039;&#039;&#039;zahlen schreibt man im AVR-Assembler mit &amp;quot;0b&amp;quot; am Anfang, z.&amp;amp;nbsp;B. 0b00110100. In [[C]]-Programmen ist die direkte Eingabe von Binärzahlen nicht möglich, es lassen sich aber [[C Makros|Makros]] zu diesem Zweck schreiben. Einige Compiler verfügen über eine Spracherweiterung, bei der meist der Präfix &amp;quot;0b&amp;quot; für Binärzahlen benutzt wird.&lt;br /&gt;
&lt;br /&gt;
=== Intel-Syntax ===&lt;br /&gt;
[[Assembler]] mit Intel-Syntax (z.&amp;amp;nbsp;B. für 80x86 oder [[8051]]) verwenden dagegen zur Kennzeichnung keinen Präfix sondern einen Postfix. Für Hexzahlen gilt also z.&amp;amp;nbsp;B. die Notation 0A5H, für Oktalzahlen 245O (oder 245Q) und für Binärzahlen dementsprechend 10100101B.&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
=== Anmerkung zu Oktalzahlen ===&lt;br /&gt;
Oktalzahlen sind in der Mikrocontroller-Programmierung heute seltener anzutreffen. Praktisch sind sie vor allem dann, wenn Binärzahlen aus irgend einem Grund in Gruppen von jeweils drei Bit strukturiert sind. Das gilt z.&amp;amp;nbsp;B. für die Datei-Zugriffsrechte unter [[Unix]]/[[Linux]], die sich bequem durch Angabe einer Oktalzahl einstellen lassen (z.&amp;amp;nbsp;B. entspricht &amp;quot;751&amp;quot; dem Bitmuster &amp;quot;111 101 001&amp;quot; oder &amp;quot;rwxr-x--x&amp;quot; in der üblichen Zugriffsrecht-Darstellung.) .&lt;br /&gt;
&lt;br /&gt;
=== Umrechnung ===&lt;br /&gt;
Viele Taschenrechner können die Zahlensysteme umrechnen, so auch der Windows-Taschenrechner oder der UNIX-Taschenrechner bc. Wie die Umrechnung mathematisch funktioniert, ist [http://www.tutorials.at/einfuehrung/03-zahlensysteme.html hier] beschrieben. Zur Umrechnung von Nachkommastellen siehe [https://www.studienservice.de/thema/dezimal-in-hexadezimal.71337/#post-1140103 hier].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* Forenthread [https://www.mikrocontroller.net/topic/429490 Einführung des Hexadezimalsystems] und Website [https://sedimal.de sedimal.de] mit der Intention der Einführung des hexadezimalen Zahlensystems im Alltag&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmen und Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107220</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107220"/>
		<updated>2024-12-28T13:59:06Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107217</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107217"/>
		<updated>2024-12-24T14:23:33Z</updated>

		<summary type="html">&lt;p&gt;Bome: /* Übersicht */  Weitere FPGA-Boards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Der 8bit-Rechner bo8h existiert bisher nur als Prototyp-Gerät&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE10-Lite Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic Cyclone V GX Starterkit&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;&#039;CPU bo8&#039;&#039;&#039; ist eine Eigenentwicklung und hat keine Interrupts. Merkmale des Gesamtsystems&lt;br /&gt;
sind der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare Programmlaufzeiten.&lt;br /&gt;
Der Zeichensatz beinhaltet neben Buchstaben und Sonderzeichen einen Satz von sechzehn Ziffern,&lt;br /&gt;
wobei die Ziffern A bis F durch modifizierte Buchstaben dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC&lt;br /&gt;
und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [http://www.bo8h.de bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gab es einen Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Assembler und ein Emulations-Programm.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107209</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107209"/>
		<updated>2024-12-14T13:28:42Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bessere Beschreibung des Takts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Meine Website zum Projekt: http://www.bo8h.de&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
&lt;br /&gt;
An beiden Eingängen C0 C1 kann Cx anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
Oder es können verschiedene Takte C0 C1 anliegen&lt;br /&gt;
C0 liefert die fallende und C1 die steigende Flanke&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107207</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107207"/>
		<updated>2024-12-12T16:43:02Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome setzte Datei:Bo8h.zip auf eine alte Version zurück&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107188</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107188"/>
		<updated>2024-12-01T22:21:49Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome setzte Datei:Bo8h.zip auf eine alte Version zurück&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107181</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107181"/>
		<updated>2024-11-29T21:10:36Z</updated>

		<summary type="html">&lt;p&gt;Bome: Repeat-Funktion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Meine Website zum Projekt: http://www.bo8h.de&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
&lt;br /&gt;
An Eingängen C0 C1 darf Cx statt C0 C1 anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
Einlesen von REP zu jedem Zeitpunkt 2 (Mitte eines Vollzyklus)&lt;br /&gt;
REP bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107179</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107179"/>
		<updated>2024-11-29T16:24:23Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107177</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107177"/>
		<updated>2024-11-28T00:32:12Z</updated>

		<summary type="html">&lt;p&gt;Bome: Fehler bei Upload?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;br /&gt;
&lt;br /&gt;
Bei Klick auf den Zeitpunkt 27.Nov.2024 wird die &#039;&#039;&#039;vorherige&#039;&#039;&#039; Version heruntergeladen. ???&lt;br /&gt;
https://www.mikrocontroller.net/topic/573264&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107176</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=107176"/>
		<updated>2024-11-27T14:00:51Z</updated>

		<summary type="html">&lt;p&gt;Bome: Repeat-Funktion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Meine Website zum Projekt: http://www.bo8h.de&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
&lt;br /&gt;
An Eingängen C0 C1 darf Cx statt C0 C1 anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
                   Einlesen von REP bei HA zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
REP wird eingelesen zu Zeitpunkten 2 (Mitte eines Vollzyklus)&lt;br /&gt;
und bewirkt Anhängen eines (AR/BN) oder eines weiteren (AR/BN)&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107175</id>
		<title>8bit-Computer: bo8h</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-Computer:_bo8h&amp;diff=107175"/>
		<updated>2024-11-27T13:55:29Z</updated>

		<summary type="html">&lt;p&gt;Bome: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
=Übersicht=&lt;br /&gt;
&lt;br /&gt;
Habe einen 8bit-Rechner entwickelt und als Prototyp-Gerät realisiert&lt;br /&gt;
auf folgenden FPGA-Boards:&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3A Starter Kit&#039;&#039;&#039; von Xilinx&lt;br /&gt;
* &#039;&#039;&#039;Spartan-3E Starter Board&#039;&#039;&#039; und&lt;br /&gt;
* &#039;&#039;&#039;Nexys2 Board&#039;&#039;&#039; von Digilent&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE1 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0 Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-CV Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terasic DE0-nano Board&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Waveshare OpenEP4CE10 Board&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die Realisierung auf dem Spartan-3A Starter Kit funktioniert auch auf dem &#039;&#039;Spartan-3AN Starter Kit&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Spartan-3E Starter Board von Digilent ist baugleich mit dem Spartan-3E Starter Kit von Xilinx.&lt;br /&gt;
&lt;br /&gt;
Die CPU ist eine Eigenentwicklung. Merkmale des Gesamtsystems sind&lt;br /&gt;
der aus mehreren 64KByte-Seiten bestehende Adressraum, das Steckplatz-Konzept,&lt;br /&gt;
eine an die Hardware angepasste Programmiersprache und taktgenau berechenbare&lt;br /&gt;
Programmlaufzeiten. Der Zeichensatz beinhaltet einen hexadezimalen Ziffernsatz,&lt;br /&gt;
welcher für die Ziffern A..F spezielle Zeichen verwendet.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät besitzt Bildschirm und Tastatur, nutzt [[RS232]] zum Daten-Austausch mit PC und hat eine SD-Karte mit selbstgestricktem Dateisystem.&lt;br /&gt;
Der [[VHDL]]-Code ist so geschrieben, dass leicht weitere Schnittstellen eingebaut werden können.&lt;br /&gt;
&lt;br /&gt;
* Informationen und Downloads gibt es auf [http://www.bo8h.de bo8h.de].&lt;br /&gt;
* Kopie des Download-Files von bo8h.de: [[Datei:Bo8h.zip]]&lt;br /&gt;
* Wiki-Artikel zur CPU: [[8bit-CPU: bo8]].&lt;br /&gt;
* Beitrag im &#039;&#039;&#039;Forum&#039;&#039;&#039; Projekte &amp;amp; Code: [http://www.mikrocontroller.net/topic/297603 8bit-Computing mit FPGA].&lt;br /&gt;
* Im &#039;&#039;embedded-projects-Journal 14&#039;&#039;&amp;amp;nbsp; gibt es den Artikel &#039;&#039;Ein 8bit-Rechner auf dem Spartan-3A-Starterkit&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Das Prototyp-Gerät hat 4 freie virtuelle Steckplätze mit je 64KByte, wobei je 32KByte&lt;br /&gt;
für Software vorgesehen sind. Damit haben Software-Entwickler die Möglichkeit,&lt;br /&gt;
Steckkarten-Software in Eigen-Regie anzubieten. Zur Software-Entwicklung&lt;br /&gt;
auf PC gibt es einen in C geschriebenen Cross-Assembler.&lt;br /&gt;
&lt;br /&gt;
=Die CPU=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Der Punkt in den Mnemonics steht für einen auf der Grundlinie liegenden Bindestrich.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Akku &#039;&#039;&#039;A&#039;&#039;&#039; und das Erweiterungsregister &#039;&#039;&#039;B&#039;&#039;&#039; sind 8-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Doppelregister AB wird abkürzend mit &#039;&#039;&#039;K&#039;&#039;&#039; bezeichnet.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Vorzeichenbit A7 wird abkürzend mit &#039;&#039;&#039;U&#039;&#039;&#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Programmzähler &#039;&#039;&#039;P&#039;&#039;&#039; und die Adressregister &#039;&#039;&#039;X&#039;&#039;&#039;, &#039;&#039;&#039;Y&#039;&#039;&#039;, &#039;&#039;&#039;Z&#039;&#039;&#039; sind 16-bit.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Register &#039;&#039;&#039;Q&#039;&#039;&#039; erhält bei Sprüngen die Rückkehradresse P+1.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;R&#039;&#039;&#039; ist Schleifen-Startadresse, &#039;&#039;&#039;S&#039;&#039;&#039; ist Schleifenzähler (16-bit).&lt;br /&gt;
&lt;br /&gt;
Einziges Flag ist der Carry &#039;&#039;&#039;V&#039;&#039;&#039;. Bei bedingten Sprüngen kann ausserdem abgefragt werden, ob U/A/K Null sind.&lt;br /&gt;
&lt;br /&gt;
Alle Speicherzugriffe sind 8bit-Zugriffe.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;GTMX&amp;lt;/u&amp;gt; lädt nach A den Inhalt der Speicherzelle, auf welche X zeigt.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;STMX&amp;lt;/u&amp;gt; speichert A in der Speicherzelle, auf welche X zeigt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;IXE&amp;lt;/u&amp;gt; inkrementiert X und tauscht A und B.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;DXE&amp;lt;/u&amp;gt; dekrementiert X und tauscht A und B.&lt;br /&gt;
&lt;br /&gt;
Damit lassen sich 2-byte-Speicherzugriffe aufbauen&amp;lt;br&amp;gt;&lt;br /&gt;
nach dem Muster GTMX..IXE..GTMX und STMX..DXE..STMX.&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt hierfür die Assembler-Makros &amp;lt;u&amp;gt;GTMXI&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;STMXD&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
ST.Y    überträgt die Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
GTMXI   lädt eine Adresse von Position X&lt;br /&gt;
AD.X    addiert X&lt;br /&gt;
ST.Y    überträgt die zu X relative Adresse nach Y&lt;br /&gt;
&lt;br /&gt;
J..     Sprung zu der Adresse, welche in K steht&lt;br /&gt;
&lt;br /&gt;
GTA 59  lädt den Wert 0059 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     Sprung nach 3559&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTA 3559&lt;br /&gt;
J&lt;br /&gt;
&lt;br /&gt;
GTR 59  lädt den Wert P+0059+3 nach K&lt;br /&gt;
AD. 35  addiert 35 zu A&lt;br /&gt;
J..     relativer Sprung nach P+3559+3&lt;br /&gt;
&lt;br /&gt;
Das lässt sich kürzer schreiben mit Assembler-Makro&lt;br /&gt;
/GTR 3559&lt;br /&gt;
J &lt;br /&gt;
&lt;br /&gt;
GT.Q  lädt Rückkehradresse nach K&lt;br /&gt;
J     Rücksprung aus Unterprogramm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn ein Unterprogramm selber J.. ausführen will für andere Zwecke als für den Rücksprung,&lt;br /&gt;
muss es vorher die Rückkehradresse sichern. Dazu kann es die Rückkehradresse aus Q laden,&lt;br /&gt;
anfangs steht sie aber auch in K und das Laden kann entfallen.&lt;br /&gt;
&lt;br /&gt;
Ausser dem Sprungbefehl J.. gibt es die bedingten Sprünge mit 8bit-Sprungdistanz:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;O.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Vorwärtssprung falls cc) und &amp;lt;u&amp;gt;B.cc&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; (Rückwärtssprung falls cc).&lt;br /&gt;
&lt;br /&gt;
Für schnelle Schleifen gibt es die Repeat-Befehle &amp;lt;u&amp;gt;R.cc&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Repeat-Befehle gibt es kombiniert mit Schleifenzähler-Dekrementieren und Adresse-Inkrementieren/Dekrementieren.&lt;br /&gt;
Die Schleifenstartadresse R wird gesetzt vor dem Schleifenanfang mittels &amp;lt;u&amp;gt;S.RP&amp;lt;/u&amp;gt; oder mittels &amp;lt;u&amp;gt;O.RP&amp;amp;nbsp;nn&amp;lt;/u&amp;gt;.&lt;br /&gt;
Bei letzterem wird gleichzeitig ein Vorwärtssprung ausgeführt. Damit sind Schleifen mit Hineinsprung (while-Schleifen) realisierbar.&lt;br /&gt;
&lt;br /&gt;
Bei J.. wird die Zieladresse auch nach R übertragen. Das garantiert, dass R stets eine Adresse im Nahbereich&lt;br /&gt;
des Programmzählers enthält. Eine Anwendung hiervon ergibt sich beim Sprung in eine Tabelle, welche aus&lt;br /&gt;
&amp;lt;u&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; -Befehlen (Vorwärtssprung always) besteht, wobei die &amp;lt;U&amp;gt;O.WY&amp;amp;nbsp;nn&amp;lt;/u&amp;gt; alle zur&lt;br /&gt;
selben Adresse springen. Die dortige Routine kann durch Auswertung von R die Nummer des O.WY-Befehls ermitteln.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Adressierung mehrerer 64K-Seiten:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zu jeder auf dem Adressbus ausgegebenen Adresse wird auf den Steuerleitungen angezeigt, von welchem der&lt;br /&gt;
Adressregister P, X, Y, Z sie kommt. Dadurch kann eine externe Logik jedem der Adressregister eine eigene&lt;br /&gt;
64K-Speicherseite zuordnen. Die CPU kann spezielle Steuersignale ausgeben, welche die externe Logik&lt;br /&gt;
zur Memory-Page-Umschaltung für eines der Adressregister veranlassen sollen.&lt;br /&gt;
&lt;br /&gt;
Der Befehl &amp;lt;u&amp;gt;H..&amp;lt;/u&amp;gt; ist der einzige und universell einsetzbare IO-Befehl.&lt;br /&gt;
Es wird K auf dem Adressbus ausgegeben und der Datenbus nach A eingelesen.&lt;br /&gt;
&lt;br /&gt;
Wenn auf H.. ein J.. folgt, dann wirkt H.. stattdessen als Präfix und bewirkt,&lt;br /&gt;
dass J.. mit einer Memory-Page-Umschaltung kombiniert wird. So kann die CPU von einer&lt;br /&gt;
64K-Seite in eine andere springen, ohne dass es einen gemeinsamen Speicherbereich geben muss.&lt;br /&gt;
&lt;br /&gt;
Bei den Adressregistern X, Y, Z gibt es spezielle Befehle &amp;lt;u&amp;gt;SW.X&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Y&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SW.Z&amp;lt;/u&amp;gt; für die Memory-Page-Umschaltung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Gesamt-Hardware=&lt;br /&gt;
&lt;br /&gt;
Es gibt vier Memory-Pages mit je 64KByte:&lt;br /&gt;
&lt;br /&gt;
* Page 0:  Aktiver Steckplatz&lt;br /&gt;
* Page 1:  ROM (32K), Text-RAM (16K), Video-RAM (16K)&lt;br /&gt;
* Page 2:  Haupt-RAM&lt;br /&gt;
* Page 3:  Zusatz-RAM&lt;br /&gt;
&lt;br /&gt;
Der aktive Steckplatz in Page 0 wird durch ein 3bit-Register SLT ausgewählt.&lt;br /&gt;
Neben Page 0 wird auch IO-Adressraum zugeteilt.&lt;br /&gt;
Die Steckkarten sollten ein Software-ROM und IO-Hardware enthalten.&lt;br /&gt;
&lt;br /&gt;
Es gibt die 2bit-Register MP, MX, MY, MZ. Diese Register legen fest, in welche der vier Memory-Pages&lt;br /&gt;
das betreffende Adressregister P, X, Y, Z zeigt. Ausserdem gibt es die Schattenregister NP, NX, NY, NZ.&lt;br /&gt;
Das CPU-Signal zur Memory-Page-Umschaltung für ein bestimmtes Adressregister # bewirkt den&lt;br /&gt;
Austausch von M# und N#, wobei # hier für P, X, Y, Z steht.&lt;br /&gt;
Beim Sprung mit Memory-Page-Umschaltung &amp;amp;nbsp;H..&amp;amp;nbsp;&amp;amp;nbsp;J..&amp;amp;nbsp; werden also MP und NP getauscht.&lt;br /&gt;
Die Schattenregister NP, NX, NY, NZ können über IO-Befehle H.. mit einem Wert 0 bis 3 geladen werden.&lt;br /&gt;
&lt;br /&gt;
Das Display ist 512 Pixel breit und 256 Pixel hoch, die Pixel sind zweiwertig.&lt;br /&gt;
Der Video-Generator liest in Dauerschleife das Video-RAM und erzeugt daraus die VGA-Signale.&lt;br /&gt;
Einen Hardware-Zeichengenerator gibt es nicht.&lt;br /&gt;
Die Software liest die Zeichen aus dem Text-RAM und schreibt deren Pixelmuster ins Video-RAM.&lt;br /&gt;
Die Textzeilen sind 64 Zeichen breit.&lt;br /&gt;
Durch Invertierung eines Flipflops können Text-RAM und Video-RAM ihre Rollen tauschen.&lt;br /&gt;
So kann die CPU im Text-RAM eine neue Grafik erstellen, während noch das alte Video-RAM angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Die Programmiersprache=&lt;br /&gt;
&lt;br /&gt;
Der Compiler erzeugt einen Zwischencode, welcher interpretativ abgearbeitet wird. Der&lt;br /&gt;
Zwischencode besteht aus Aufrufen vorgefertigter Maschinenroutinen. Nur wenige dieser&lt;br /&gt;
Maschinenroutinen sind interner Teil der Sprache, die meisten liegen in den 8 Steckkarten.&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist strikt imperativ. Es besteht eine direkte Eins-zu-Eins-Entsprechung zwischen dem Quelltext und&lt;br /&gt;
der Folge der Operationen im Zwischencode. Es gibt im Quelltext keine arithmetischen oder logischen Ausdrücke.&lt;br /&gt;
&lt;br /&gt;
Es gibt in dieser Sprache kein goto, kein break, kein continue, und in jedem Programm oder&lt;br /&gt;
Unterprogramm genau 1 return, nämlich am Ende des Programms oder Unterprogramms.&lt;br /&gt;
&lt;br /&gt;
Die Strukturelemente sind folgende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bedingte Anweisung:  IF.c  ...  ENDF&lt;br /&gt;
Verzweigung:         IF.c  ...  ELSE  ...  ENDE&lt;br /&gt;
Case-Struktur:       CASE /nn  ...  NEXT /nn  ...  LAST&lt;br /&gt;
Do-while-Schleife:   LOOP  ...  RP.c&lt;br /&gt;
While-Schleife:      L.JP  ...  HERE  ...  RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
c steht hier für die Sprungbedingung, nn steht für eine Zahl&lt;br /&gt;
fallend bis 00, NEXT /nn ist entsprechend mehrmals anzugeben.&amp;lt;br&amp;gt;&lt;br /&gt;
RP.c steht für wiederhole falls c.&lt;br /&gt;
&lt;br /&gt;
Ebenso wie die Verzweigung zählt die Schleife mit Hineinsprung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L.JP ... HERE ... RP.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
als ein Block mit zwei Unterblöcken, die strenge Blockstruktur wird durch den Hineinsprung nicht durchbrochen.&lt;br /&gt;
&lt;br /&gt;
Die Blockstruktur wird bei folgenden Operationen gebraucht:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ACQU  ...  UACQ&lt;br /&gt;
FASN  ...  UFAS&lt;br /&gt;
LN.1  ...  RELS    //    LN.2  ...  RELS&lt;br /&gt;
LX.1  ...  RELS    //    LX.2  ...  RELS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACQU  steht für Aquirieren von Residenten Variablen&amp;lt;br&amp;gt;&lt;br /&gt;
UACU  macht das Aquirieren rückgängig&lt;br /&gt;
&lt;br /&gt;
Residente Variable sind Variable, zB. vom Typ databox, welche ausserhalb des Programms dauerhaft im RAM&lt;br /&gt;
liegen. Sie sind über ihren Namen auffindbar und werden über ihre Nummer adressiert. ACQU bindet freie&lt;br /&gt;
Zeiger, welche im Programm vereinbart sind, an diese externen Variablen. Dadurch sind diese Variablen unter&lt;br /&gt;
Umgehung des Namens und der Nummer wie gewöhnliche im Programm vereinbarte Variable verfügbar.&lt;br /&gt;
&lt;br /&gt;
FASN  vergibt den Status &amp;quot;befestigt&amp;quot; an Variable vom Typ databox&amp;lt;br&amp;gt;&lt;br /&gt;
UFAS  macht die Vergabe rückgängig.&lt;br /&gt;
&lt;br /&gt;
Variable vom Typ databox, welche beim Start des Programms automatisch installiert werden&lt;br /&gt;
oder danach durch LN/LX installiert werden, sind von sich aus &amp;quot;befestigt&amp;quot;. Das Installieren&lt;br /&gt;
kann aber auch durch Steckkarten-Kommandos erfolgen, zB. wenn die Größe der databox&lt;br /&gt;
erst zur Laufzeit des Programms bekannt wird. Dann sind sie zunächst unbefestigt.&lt;br /&gt;
&lt;br /&gt;
LN.1  leiht den von einer databox in RAM1 belegten Speicherplatz an mehrere Variable aus, welche vorher als&lt;br /&gt;
nicht installiert vereinbart wurden und nach dem Ausleihen den Speicherplatz der databox überdecken.&lt;br /&gt;
&lt;br /&gt;
LX.1  leiht einen Teil des Speicherplatzes einer databox ab einem Startindex an mehrere Variable aus.&lt;br /&gt;
&lt;br /&gt;
Entsprechend LN.2 und LX.2 für RAM2. In RAM1 sind die mehreren&lt;br /&gt;
Variablen kurze Variable vom Typ data, oder selber wieder vom&lt;br /&gt;
Typ databox, in RAM2 sind sie stets wieder vom Typ databox.&lt;br /&gt;
&lt;br /&gt;
Beim Ausleihen aus einer databox prüft LN/LX, ob die databox befestigt ist. Andernfalls&lt;br /&gt;
wäre sie verschiebbar oder könnte uninstalliert werden, so dass Schreibzugriffe auf die&lt;br /&gt;
durch das Ausleihen erzeugten Variablen Unheil anrichten könnten.&lt;br /&gt;
&lt;br /&gt;
RELS  macht das Ausleihen rückgängig.&lt;br /&gt;
&lt;br /&gt;
Bei den Operationen ACQU, FASN, LN/LX garantiert der Compiler,&lt;br /&gt;
dass das zugehörige UACQ, UFAS, RELS im selben Block liegt.&lt;br /&gt;
Die jeweilige Operation und das zugehörige Rückgängigmachen&lt;br /&gt;
bilden selber wieder einen Block.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ergänzung zu Sprungbedingungen:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Es kann abgefragt werden, ob eine 1-oder 2-Byte-Variable&lt;br /&gt;
Null ist und ob sie gleich ff bzw. ffff ist.&lt;br /&gt;
&lt;br /&gt;
Die Kommandos  =TT.Z  und  =TT.M  können diese Bedingungen&lt;br /&gt;
speichern in einem speziellen Byte im RAM, dem TF-Merker.&lt;br /&gt;
Dazu schieben sie eine 1 oder 0 von oben auf den TF-Merker.&lt;br /&gt;
In gleicher Weise können Steckkarten-Kommandos nCOMMAND&lt;br /&gt;
beliebige Bedingungen ermitteln und speichern.&lt;br /&gt;
&lt;br /&gt;
Es gibt bedingte Sprünge, welche die obersten 3 Bit des&lt;br /&gt;
TF-Merker mittels einer Wahrheitstabelle abfragen. Dabei&lt;br /&gt;
können bis zu 3 Bits wieder vom TF-Merker entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Mittels der Routinen =PP.r, =PZ.r, =PM.r ist es möglich,&lt;br /&gt;
solche Bedingungen in einer 1- oder 2-Byte-Variablen zu&lt;br /&gt;
speichern, zu verANDen und zu verORen. Damit lassen&lt;br /&gt;
sich beliebig komplexe Sprungbedingungen berechnen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unterprogramme:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In der Programmiersprache gibt es keine functions mit&lt;br /&gt;
Rückgabewert, sondern nur einfache Unterprogramme, bei&lt;br /&gt;
welchen alle Parameter gleichberechtigt sind. Es werden&lt;br /&gt;
ausschließlich Zeiger übergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variablen vom Typ FIX:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ihre Werte sind Teil des Programmcodes und liegen dort am Ende.&lt;br /&gt;
Der gesamte Speicherbereich dieser Werte kann als &amp;quot;FIXBOX&amp;quot; vom&lt;br /&gt;
Programm abgetrennt werden und dann mittels eines speziellen&lt;br /&gt;
Werkzeugs bearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107174</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107174"/>
		<updated>2024-11-27T13:50:56Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107155</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107155"/>
		<updated>2024-11-01T13:49:58Z</updated>

		<summary type="html">&lt;p&gt;Bome: Fehler-Korrektur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 21.Okt.24 enthält in der Datei Hardware.txt für DE0-nano die Zuodnungen VGA/HS-S08, VGA/VS-S10, PS2/DAT-S34, PS2/CLK-S36. Diese Zuordnungen sind veraltet und falsch. Korrekt sind VGA/HS-S10, VGA/VS-S08, PS2/DAT-S36, PS2/CLK-S34.&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107143</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=107143"/>
		<updated>2024-10-21T20:00:12Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=106929</id>
		<title>Datei:Bo8h.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Bo8h.zip&amp;diff=106929"/>
		<updated>2024-06-11T19:13:32Z</updated>

		<summary type="html">&lt;p&gt;Bome: Bome lud eine neue Version von Datei:Bo8h.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quelle: Josef Gnadl&lt;br /&gt;
&lt;br /&gt;
Kopie des Download-Files von bo8h.de&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte beachten Sie die Hinweise auf bo8h.de&lt;br /&gt;
&lt;br /&gt;
Das Urheberrecht an allen Inhalten des Download-Files hat der Inhaber von bo8h.de, Josef Gnadl.&lt;br /&gt;
Er erklärt hiermit seinen im Rahmen der Gesetze weitestmöglichen Verzicht auf alle daraus entstehenden&lt;br /&gt;
Ansprüche, die Nutzung durch andere Personen zu beschränken oder für die Nutzung eine Vergütung zu fordern.&lt;br /&gt;
&lt;br /&gt;
Die Version vom 2.Jan.2023 ist die letzte Version mit Terasic-DE1 und Waveshare-OpenEP4CE10.&lt;br /&gt;
&lt;br /&gt;
Die Datei vom 14.Nov.2023 enthält versehentlich noch die vorherige Version von cpu.vhd und ram32.vhd.&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=106915</id>
		<title>8bit-CPU: bo8</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=8bit-CPU:_bo8&amp;diff=106915"/>
		<updated>2024-06-06T00:44:36Z</updated>

		<summary type="html">&lt;p&gt;Bome: Funktion des REP-Signals geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von:&#039;&#039;&amp;amp;nbsp;&amp;amp;nbsp; Josef Gnadl ([http://www.mikrocontroller.net/articles/Benutzer:Bome bome])&lt;br /&gt;
&lt;br /&gt;
Die CPU ist Teil eines Gesamt-Projekts: [[8bit-Computer: bo8h]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch eine erläuternde Beschreibung der CPU.&lt;br /&gt;
&lt;br /&gt;
Meine Website zum Projekt: http://www.bo8h.de&lt;br /&gt;
&lt;br /&gt;
Beitrag im Forum: [http://www.mikrocontroller.net/topic/407050 Befehlssatz der bo8-CPU]&amp;lt;br /&amp;gt;&lt;br /&gt;
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Text steht der Punkt in den Mnemonics für einen&amp;lt;br /&amp;gt;&lt;br /&gt;
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
================================================================&lt;br /&gt;
&lt;br /&gt;
P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U&lt;br /&gt;
|  | | |  | | |    |A                               AB = K&lt;br /&gt;
|  | | |  | | |    |B&lt;br /&gt;
&lt;br /&gt;
P Programmzähler      Q Rückkehradresse&lt;br /&gt;
X Adressregister      R Schleifenstartadresse&lt;br /&gt;
Y Adressregister      S Schleifenzähler&lt;br /&gt;
Z Adressregister      A Akku   B Erweiterung   V Carry&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
a0 .. af     Adressleitungen   - Tristate&lt;br /&gt;
d0 .. d7     Datenleitungen    - Tristate&lt;br /&gt;
N0 .. N3     Typleitungen      - permanente Ausgänge&lt;br /&gt;
RES   REP    Reset  Repeat     - Eingänge&lt;br /&gt;
C0    C1     Takt   Takt       - Eingänge&lt;br /&gt;
&lt;br /&gt;
    0     1 2     3 0     1 2     3 0&lt;br /&gt;
    /     / /     / /     / /     / /&lt;br /&gt;
====----====----====----====----====----  C0&lt;br /&gt;
--====----====----====----====----====--  C1&lt;br /&gt;
    [  tA   [  tB   [  tA   [  tB   [&lt;br /&gt;
&lt;br /&gt;
--==------==------==------==------==----  Cx&lt;br /&gt;
&lt;br /&gt;
An Eingängen C0 C1 darf Cx statt C0 C1 anliegen&lt;br /&gt;
Cx darf auch symmetrisch sein (Tastgrad 50%)&lt;br /&gt;
&lt;br /&gt;
Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).&lt;br /&gt;
&lt;br /&gt;
Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2&lt;br /&gt;
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2&lt;br /&gt;
                   Einlesen von Read-Daten zum Zeitpunkt 2&lt;br /&gt;
                   Einlesen von REP bei HA zum Zeitpunkt 2&lt;br /&gt;
&lt;br /&gt;
RES muss enden mit Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1&lt;br /&gt;
Zum Zeitpunkt 2 Einlesen der Startadresse nach P und R vom&lt;br /&gt;
Adressbus und des Akku A vom Datenbus. Folgender Zeitpunkt 0&lt;br /&gt;
Start des Programmms mit (FE/BN) für ersten OpCode.&lt;br /&gt;
&lt;br /&gt;
REP wird eingelesen in der Mitte eines IO-Zyklus (HA/BP) oder&lt;br /&gt;
eines Wait-Zyklus (AR/BN). REP bewirkt Anhängen eines (AR/BN).&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
Typ    Name  Funktion&lt;br /&gt;
&lt;br /&gt;
0/tB   BN    normal tB   inaktiv&lt;br /&gt;
1/tA   AR    repeat tA   inaktiv   - wiederhole input&lt;br /&gt;
2/tA   KA    Adressbus gibt K aus  - Datenbus inaktiv&lt;br /&gt;
3/tA   HA    Adressbus gibt K aus  - input A&lt;br /&gt;
&lt;br /&gt;
4/tB   BP    memory-page-Umschaltung für P&lt;br /&gt;
5/tB   BX    memory-page-Umschaltung für X&lt;br /&gt;
6/tB   BY    memory-page-Umschaltung für Y&lt;br /&gt;
7/tB   BZ    memory-page-Umschaltung für Z&lt;br /&gt;
&lt;br /&gt;
8/tA   FE    read  / Adresse ist P / OP-Code&lt;br /&gt;
9/tA   WX    write / Adresse ist X&lt;br /&gt;
a/tA   WY    write / Adresse ist Y&lt;br /&gt;
b/tA   WZ    write / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
c/tA   RP    read  / Adresse ist P&lt;br /&gt;
d/tA   RX    read  / Adresse ist X&lt;br /&gt;
e/tA   RY    read  / Adresse ist Y&lt;br /&gt;
f/tA   RZ    read  / Adresse ist Z&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
      +0     +1     +2     +3     +4     +5     +6     +7&lt;br /&gt;
&lt;br /&gt;
00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z&lt;br /&gt;
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7&lt;br /&gt;
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7&lt;br /&gt;
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7&lt;br /&gt;
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z&lt;br /&gt;
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7&lt;br /&gt;
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7&lt;br /&gt;
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7&lt;br /&gt;
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US&lt;br /&gt;
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS&lt;br /&gt;
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NOL&lt;br /&gt;
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL&lt;br /&gt;
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.&lt;br /&gt;
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX&lt;br /&gt;
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY&lt;br /&gt;
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ&lt;br /&gt;
80-   NO2    TK1    TK2    TK3    TK4    TK5    TK6    TK7&lt;br /&gt;
88-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf&lt;br /&gt;
90-   NO1    TA1    TA2    TA3    TA4    TA5    TA6    TA7&lt;br /&gt;
98-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B&lt;br /&gt;
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S&lt;br /&gt;
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X&lt;br /&gt;
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y&lt;br /&gt;
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z&lt;br /&gt;
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS&lt;br /&gt;
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ&lt;br /&gt;
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z&lt;br /&gt;
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE&lt;br /&gt;
e0-   ZO.U   SE.U   ZO.V   SE.V   CP.U   NE.U   CP.V   NE.V&lt;br /&gt;
e8-   PV.A   TZ.A   PV.B   TZ.B   RD.A   RU.A   RD.B   RU.B&lt;br /&gt;
f0-   ZO.A   NE.A   ZO.B   NE.B   IV.A   DV.A   SL.K   S.RP&lt;br /&gt;
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Byte&lt;br /&gt;
40 .. 67     2 Byte&lt;br /&gt;
68 .. ff     1 Byte&lt;br /&gt;
&lt;br /&gt;
00 .. 3f     1 Zyklus   / Sonderfall 00&lt;br /&gt;
40 .. 53   2|3 Zyklen&lt;br /&gt;
54 .. 7f     2 Zyklen   / Sonderfall 57&lt;br /&gt;
80 .. ff     1 Zyklus   / Sonderfall 80&lt;br /&gt;
&lt;br /&gt;
Während der Ausführung eines Befehls&lt;br /&gt;
wird der nachfolgende OpCode geladen.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z&lt;br /&gt;
&lt;br /&gt;
AN.B      A &amp;lt;=  A and B&lt;br /&gt;
NR.B      A &amp;lt;=  A nor B&lt;br /&gt;
XR.B      A &amp;lt;=  A xor B&lt;br /&gt;
AV.B      A &amp;lt;=  A+B+V            V &amp;lt;= Carry&lt;br /&gt;
SV.B      A &amp;lt;=  A-B-V            V &amp;lt;= Carry&lt;br /&gt;
LV.B      A &amp;lt;=  B-A-V            V &amp;lt;= Carry&lt;br /&gt;
GT.B      A &amp;lt;=  B&lt;br /&gt;
ST.B      B &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AN. nn    A &amp;lt;=  A and nn&lt;br /&gt;
NR. nn    A &amp;lt;=  A nor nn&lt;br /&gt;
XR. nn    A &amp;lt;=  A xor nn&lt;br /&gt;
AV. nn    A &amp;lt;=  A+nn+V           V &amp;lt;= Carry&lt;br /&gt;
SV. nn    A &amp;lt;=  A-nn-V           V &amp;lt;= Carry&lt;br /&gt;
LV. nn    A &amp;lt;=  nn-A-V           V &amp;lt;= Carry&lt;br /&gt;
GT. nn    A &amp;lt;=  nn&lt;br /&gt;
AD. nn    A &amp;lt;=  A+nn&lt;br /&gt;
&lt;br /&gt;
ANM%      A &amp;lt;=  A and (%)&lt;br /&gt;
NRM%      A &amp;lt;=  A nor (%)&lt;br /&gt;
XRM%      A &amp;lt;=  A xor (%)&lt;br /&gt;
AVM%      A &amp;lt;=  A+(%)+V          V &amp;lt;= Carry&lt;br /&gt;
SVM%      A &amp;lt;=  A-(%)-V          V &amp;lt;= Carry&lt;br /&gt;
LVM%      A &amp;lt;=  (%)-A-V          V &amp;lt;= Carry&lt;br /&gt;
GTM%      A &amp;lt;=  (%)&lt;br /&gt;
STM%     (%) &amp;lt;=  A&lt;br /&gt;
&lt;br /&gt;
AV.S      K &amp;lt;=  K+S+V            V &amp;lt;= Carry&lt;br /&gt;
SV.S      K &amp;lt;=  K-S-V            V &amp;lt;= Carry&lt;br /&gt;
LV.S      K &amp;lt;=  S-K-V            V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
AD.S      K &amp;lt;=  K+S&lt;br /&gt;
SD.S      K &amp;lt;=  K-S&lt;br /&gt;
LD.S      K &amp;lt;=  S-K&lt;br /&gt;
&lt;br /&gt;
AD.%      K &amp;lt;=  K+%&lt;br /&gt;
SD.%      K &amp;lt;=  K-%&lt;br /&gt;
LD.%      K &amp;lt;=  %-K&lt;br /&gt;
&lt;br /&gt;
GT.S      K &amp;lt;=  S&lt;br /&gt;
ST.S      S &amp;lt;=  K&lt;br /&gt;
GT.%      K &amp;lt;=  %&lt;br /&gt;
ST.%      % &amp;lt;=  K&lt;br /&gt;
&lt;br /&gt;
RS.%      S &amp;lt;=  %&lt;br /&gt;
SS.%      % &amp;lt;=  S&lt;br /&gt;
&lt;br /&gt;
SL.K      B &amp;lt;=  A ,    A &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
SL.S      S LowByte &amp;lt;= A ,  S HighByte &amp;lt;= 0&lt;br /&gt;
SL.%      % LowByte &amp;lt;= A ,  % HighByte &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
GL.S      A &amp;lt;= LowByte  von S&lt;br /&gt;
GH.S      A &amp;lt;= HighByte von S&lt;br /&gt;
GL.%      A &amp;lt;= LowByte  von %&lt;br /&gt;
GH.%      A &amp;lt;= HighByte von %&lt;br /&gt;
&lt;br /&gt;
EX.S      Austausch  K &amp;lt;&amp;gt; S&lt;br /&gt;
EX.%      Austausch  K &amp;lt;&amp;gt; %&lt;br /&gt;
ES.%      Austausch  S &amp;lt;&amp;gt; %&lt;br /&gt;
&lt;br /&gt;
ZO.S      S &amp;lt;= 0&lt;br /&gt;
ZO.%      % &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
ZO.V      V &amp;lt;= 0&lt;br /&gt;
SE.V      V &amp;lt;= 1&lt;br /&gt;
NE.V      V &amp;lt;= not V&lt;br /&gt;
CP.V      V &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
ZO.U      U &amp;lt;= 0&lt;br /&gt;
SE.U      U &amp;lt;= 1&lt;br /&gt;
NE.U      U &amp;lt;= not U&lt;br /&gt;
CP.U      U &amp;lt;= V xor U&lt;br /&gt;
&lt;br /&gt;
NE.A      A  wird logisch negiert&lt;br /&gt;
NE.B      B  wird logisch negiert&lt;br /&gt;
NE.K      K  wird logisch negiert&lt;br /&gt;
&lt;br /&gt;
ZO.A      A &amp;lt;= 0&lt;br /&gt;
ZO.B      B &amp;lt;= 0&lt;br /&gt;
ZO.K      K &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
IV.A      A &amp;lt;=  A+V              V &amp;lt;= Carry&lt;br /&gt;
DV.A      A &amp;lt;=  A-V              V &amp;lt;= Carry&lt;br /&gt;
&lt;br /&gt;
IC.A      A &amp;lt;=  A+1&lt;br /&gt;
IC.K      K &amp;lt;=  K+1&lt;br /&gt;
IC.S      S &amp;lt;=  S+1&lt;br /&gt;
&lt;br /&gt;
DC.A      A &amp;lt;=  A-1&lt;br /&gt;
DC.K      K &amp;lt;=  K-1&lt;br /&gt;
DC.S      S &amp;lt;=  S-1&lt;br /&gt;
&lt;br /&gt;
PV.A      A &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
PV.B      B &amp;lt;=  8-fache Kopie von V ,  V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
TZ.A      wenn nicht  A=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
TZ.B      wenn nicht  B=0   dann   ( V &amp;lt;= 1 )&lt;br /&gt;
&lt;br /&gt;
RD.A      A wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
RD.B      B wird nach unten durch V rotiert&lt;br /&gt;
           Resultat V7654321      V &amp;lt;= Bit0&lt;br /&gt;
&lt;br /&gt;
RU.A      A wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
RU.B      B wird nach oben  durch V rotiert&lt;br /&gt;
           Resultat 6543210V      V &amp;lt;= Bit7&lt;br /&gt;
&lt;br /&gt;
TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht&lt;br /&gt;
                      Resultat von TA3 ist 43210765&lt;br /&gt;
&lt;br /&gt;
TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht&lt;br /&gt;
&lt;br /&gt;
I%s  mit s= 0..7      % &amp;lt;=  %+s+1&lt;br /&gt;
D%s  mit s= 0..7      % &amp;lt;=  %-s-1&lt;br /&gt;
&lt;br /&gt;
I%E       % &amp;lt;= %+1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
D%E       % &amp;lt;= %-1 ,  und Austausch  A &amp;lt;&amp;gt; B&lt;br /&gt;
&lt;br /&gt;
IKL nn    K &amp;lt;=  K+nn+1&lt;br /&gt;
DKL nn    K &amp;lt;=  K-nn-1&lt;br /&gt;
I%L nn    % &amp;lt;=  %+nn+1&lt;br /&gt;
D%L nn    % &amp;lt;=  %-nn-1&lt;br /&gt;
&lt;br /&gt;
GTA nn    K &amp;lt;=     00nn&lt;br /&gt;
GTR nn    K &amp;lt;=     P+nn+3&lt;br /&gt;
ADR nn    K &amp;lt;=   K+P+nn+3&lt;br /&gt;
&lt;br /&gt;
NO1       no operation       1 Zyklus&lt;br /&gt;
NO2       no operation       2 Zyklen&lt;br /&gt;
&lt;br /&gt;
NOL nn    no operation    2+nn Zyklen   falls nn &amp;gt; 0&lt;br /&gt;
NOL 00    K &amp;lt;=  R            2 Zyklen&lt;br /&gt;
&lt;br /&gt;
GT.Q      K &amp;lt;=  Q&lt;br /&gt;
&lt;br /&gt;
S.RP        R &amp;lt;= P+1&lt;br /&gt;
O.RP nn     R &amp;lt;= P+2 ,   P &amp;lt;= P+nn+3&lt;br /&gt;
&lt;br /&gt;
Bedingung cc ist    WY   always&lt;br /&gt;
                    VZ   V ist 0&lt;br /&gt;
                    VS   V ist nicht 0&lt;br /&gt;
                    UZ   U ist 0&lt;br /&gt;
                    US   U ist nicht 0&lt;br /&gt;
                    AZ   A ist 0&lt;br /&gt;
                    AS   A ist nicht 0&lt;br /&gt;
                    KZ   K ist 0&lt;br /&gt;
                    KS   K ist nicht 0&lt;br /&gt;
&lt;br /&gt;
O.cc nn    wenn cc         dann ( P &amp;lt;= P+nn+3 )&lt;br /&gt;
B.cc nn    wenn cc         dann ( P &amp;lt;= P-nn-1 )&lt;br /&gt;
B.CN nn    wenn nicht S=0  dann ( P &amp;lt;= P-nn-1 , S &amp;lt;= S-1 )&lt;br /&gt;
&lt;br /&gt;
R.cc    wenn cc         dann ( P &amp;lt;= R )&lt;br /&gt;
R.CN    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 )&lt;br /&gt;
R.I%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %+1 )&lt;br /&gt;
R.D%    wenn nicht S=0  dann ( P &amp;lt;= R , S &amp;lt;= S-1 , % &amp;lt;= %-1 )&lt;br /&gt;
&lt;br /&gt;
Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V &amp;lt;= 0&lt;br /&gt;
&lt;br /&gt;
Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen&lt;br /&gt;
           wenn der Sprung erfolgt | nicht erfolgt&lt;br /&gt;
&lt;br /&gt;
J..     P &amp;lt;= K ,  R &amp;lt;= K ,    Q &amp;lt;= P+1 ,  K &amp;lt;= P+1&lt;br /&gt;
&lt;br /&gt;
SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein B% ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für %  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
H..     Nach dem Einlesen des folgenden OpCodes mit FE wird&lt;br /&gt;
        statt eines BN ein BP ausgegeben.  Das soll extern&lt;br /&gt;
        eine memory-page-Umschaltung für P  bewirken.  Das&lt;br /&gt;
        Resultat muss schon beim folgenden tA bereitstehen.&lt;br /&gt;
&lt;br /&gt;
        Wenn der eingelesene folgende OpCode ein J.. ist,&lt;br /&gt;
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.&lt;br /&gt;
&lt;br /&gt;
        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus&lt;br /&gt;
        (HA/BP). Das BP  soll die memory-page-Umschaltung&lt;br /&gt;
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.&lt;br /&gt;
&lt;br /&gt;
        Ausnahme:  Wenn der OpCode wieder ein H.. ist,&lt;br /&gt;
        folgt (KA/BN) statt (HA/BP). Danach bleibt die&lt;br /&gt;
        CPU im Zustand BN bis ein Reset erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: FPGA-Projekte]]&lt;/div&gt;</summary>
		<author><name>Bome</name></author>
	</entry>
</feed>