{"id":14539,"date":"2019-12-05T06:13:08","date_gmt":"2019-12-05T05:13:08","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=14539"},"modified":"2023-05-04T17:51:57","modified_gmt":"2023-05-04T15:51:57","slug":"chip-8-teil-2-in-welchem-das-eigentliche-programm-vorgestellt-wird","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2019\/12\/chip-8-teil-2-in-welchem-das-eigentliche-programm-vorgestellt-wird.htm","title":{"rendered":"CHIP-8: Teil 2, in welchem das eigentliche Programm vorgestellt wird"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2019\/12\/chip-8-teil-2-in-welchem-das-eigentliche-programm-vorgestellt-wird.htm#comments'>6 Kommentare.<\/a>)<\/small> <\/div>\n<p><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2019\/12\/chip-8-teil-1-in-welchem-es-vor-allem-erst-einmal-um-0-und-1-geht.htm\">Stehen geblieben waren wir<\/a> bei diesem Computerprogramm f\u00fcr den CHIP-8:<\/p>\n\n\n\n<p><code>A2 1E C2 01 32 01 A2 1A D0 14 70 04 30 40 12 00 60 00 71 04 31 20 12 00 12 18 80 40 20 10 20 40 80 10<\/code><\/p>\n\n\n\n<p>Es erzeugt ein Zufallslabyrinth so wie dieses hier:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"379\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_maze-700x379.png\" alt=\"\" class=\"wp-image-14526\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_maze-700x379.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_maze-300x162.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_maze-150x81.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_maze.png 963w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Wie geht das? Wie k\u00f6nnen ein Haufen Zahlen so etwas erzeugen?<\/p>\n\n\n\n<p>Sie k\u00f6nnen es nat\u00fcrlich nicht allein, sondern nur, wenn sie einem Computer gef\u00fcttert werden, der genau mit diesen Zahlen umgehen kann. Zentral an so einem Computer ist die Recheneinheit (die kann rechnen), dazu kommen der Arbeitsspeicher und Ein- und  Ausgabem\u00f6glichkeiten.  Gesteuert wird das ganze vom Steuerwerk. Ausgabem\u00f6glichkeiten f\u00fcr den CHIP-8 sind der Bildschirm und ein Tonsignal, Eingabem\u00f6glichkeiten eine eingeschr\u00e4nkte Tastatur, aber die brauchen wir hier gar nicht. Das kann man sich so vorstellen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"305\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_neumann.png\" alt=\"\" class=\"wp-image-14575\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_neumann.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_neumann-300x131.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_neumann-150x65.png 150w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Weil das Laden und Speichern von Daten im Arbeitsspeicher relativ langsam ist, gibt es in manchen Prozessoren spezielle Zwischenspeicher, die bequemer zug\u00e4nglich sind, Register genannt. Der CHIP-8-Prozessor hat 16 solche Register, mit V0 bis VF bezeichnet. Manche davon haben zus\u00e4tzliche Funktionen. Insgesamt sieht der Speicher des Systems zum Beispiel so aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"295\" height=\"487\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher.png\" alt=\"\" class=\"wp-image-14559\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher.png 295w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher-182x300.png 182w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher-91x150.png 91w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Der Abeitsspeicher ist in Byte-gro\u00dfe H\u00e4ppchen aufgeteilt.<\/li>\n\n\n\n<li>Jedes H\u00e4ppchen kriegt eine fortlaufende Nummer, die Adresse.<\/li>\n\n\n\n<li>Die Nummern 0 bis 1FF sind f\u00fcr Kram reserviert.<\/li>\n\n\n\n<li>Wenn ein Programm, zum Beispiel MAZE, geladen wird, dann kommt es ab Adresse (hexadezimal) 200 in den Arbeitsspeicher &#8211; ich habe das in der Grafik schon mal erledigt.<\/li>\n\n\n\n<li>Der interne Programmz\u00e4hler wird auf 200 gesetzt, das hei\u00dft, da wird das Programm beginnen.<\/li>\n<\/ul>\n\n\n\n<p>Der erste Befehl lautet A21E, dann kommt C201, und so weiter. Aus einem Handbuch zum CHIP-8 habe ich mir herausgesucht, wof\u00fcr diese und die anderen Befehle stehen. Meistens stehen die ersten vier Bit, also die erste Ziffer, f\u00fcr die Art des Befehls, quasi das Verb (setze, hole, springe, erh\u00f6he); die anderen zw\u00f6lf Bit, also Ziffern zwei bis vier, sind Adressen- oder Zahlenangaben, quasi Akkusativ- oder Dativobjekte. Hier sind die \u00dcbersetzungen der Befehle:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"677\" height=\"739\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher2.png\" alt=\"\" class=\"wp-image-14561\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher2.png 677w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher2-275x300.png 275w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_speicher2-137x150.png 137w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/figure>\n\n\n\n<p>Also: In Adresse 200-201 steht A21E, das hei\u00dft: Schreibe 21E in das I-Register. Das I steht f\u00fcr Memory Index Pointer, lese ich; sp\u00e4ter wird mir klar werden, was das bedeutet. Danach wird der Programmz\u00e4hler erh\u00f6ht, die Adresse 202-203 wird ausgewertet, wo das C201 bedeutet, dass letztlich in V2 zuf\u00e4llig eine 0 oder eine 1 geschrieben wird. In Adresse 204-205 wird mit 3201 \u00fcberpr\u00fcft, ob in V2 &#8211; dem Register, in das wir eben geschrieben haben &#8211; eine 1 steht: Wenn ja, dann wird die n\u00e4chste Zeile \u00fcbersprungen.<\/p>\n\n\n\n<p>Wichtig ist D014 an Adresse 208-209: Hier wird auf den Bildschirm gemalt! Und zwar an die Koordinaten (V0, V1) &#8211; in diese Register schreiben wir also zumindest in diesem Programm die Position, an die etwas gezeichnet werden soll! <em>Was<\/em> gezeichnet wird, war mir da noch nicht klar. Gut, vielleicht h\u00e4tte ich die Anleitung lesen sollen&#8230;<\/p>\n\n\n\n<p>Dann wird in Viererschritten die x-Koordinate erh\u00f6ht, bis zu dem H\u00f6chstwert 40 (=dezimal 64, so viele Pixel gibt es hier in der Breite), dann wieder von vorne angefangen, aber mit jeweils erh\u00f6htem y-Wert, bis am Ende an der Adresse 218-219 der Befehl 1218 erreicht wird, der besagt, dass das Programm zur Adresse 218 springen soll: eine Endlosschleife.<\/p>\n\n\n\n<p>Unklar waren mir erst die letzten 8 Byte, also die letzten vier Zeilen oben. Meine Interpretation der Zeilen als Befehl machte keinen Sinn. Und das muss sie auch gar nicht: diese Zahlen sollen gar nicht als Befehle interpretiert werden, der Programmz\u00e4hler wird nie auf ihre Adressen gesetzt, diese Zahlen sind einfach nur Zahlen. Das hei\u00dft&#8230;<\/p>\n\n\n\n<p>Erinnert ihr euch an das I-Register, den Memory Index? Und an die Zeile, an die irgendetwas an die Koordinaten (V0,V1) geschrieben werden soll? Tats\u00e4chlich passiert bei Ausf\u00fchrung des Befehls D014 Folgendes: &#8222;D&#8220; kann man sich als &#8222;display&#8220; merken; &#8222;01&#8220; bedeutet, dass die x\/y-Koordinaten in V0 und V1 stehen, und die &#8222;4&#8220; bedeutet, dass an diese Stelle 4 Byte, also 4*8 bit gezeichnet werden sollen &#8211; und zwar genau diese 4 Byte, die sich an der Stelle befinden, auf die der Memory Index verweist. Das ist entweder 21E (in Zeile 200-201 festgelegt) oder 21A (in Zeile 206-207 \u00fcberschrieben). An diesen Stellen &#8211; den letzten acht Byte des Programms &#8211; werden zwei kleine Bildchen definiert, sogenannte Sprites.<\/p>\n\n\n\n<p>Ab Adresse 21A stehen folgende 4 Bytes: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">hex 80, also bin 10000000\nhex 40, also bin 01000000\nhex 20, also bin 00100000\nhex 10, also bin 00010000<\/pre>\n\n\n\n<p>Ab Adresse 21E stehen folgende 4 Bytes:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">hex 20, also bin 00100000\nhex 40, also bin 01000000\nhex 80, also bin 10000000\nhex 10, also bin 00010000<\/pre>\n\n\n\n<p>Und diese Bytes, also eigentlich diese Bits, werden als kleine Bildchen interpretiert:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"121\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites.png\" alt=\"\" class=\"wp-image-14580\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites.png 636w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites-300x57.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites-150x29.png 150w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Diese Bildchen (Sprites) sind immer 8 Pixel breit, aber sie k\u00f6nnen bis zu 15 Pixel hoch sein &#8211; hier sind sie 4 Pixel hoch, weil sie aus vier Byte bestehen. Das Labyrinth braucht nur die linke H\u00e4lfte der Sprites, deswegen wird das n\u00e4chste Sprite ja auch vier Pixel versetzt gezeichnet und \u00fcberlagert damit die leeren Pixel des Vorg\u00e4ngers.<\/p>\n\n\n\n<p>Und jetzt kann man experimentieren. Die letzten acht Byte des Programmcoes definieren die beiden Sprites. Wenn ich die ersetze durch <code>80 40 40 80 10 20 20 10<\/code>, dann sehen die beiden Sprites so aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"124\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites2.png\" alt=\"\" class=\"wp-image-14571\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites2.png 636w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites2-300x58.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_sprites2-150x29.png 150w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/figure>\n\n\n\n<p>Dann ist das Zufallslabyrinth gar keines mehr:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"379\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_mazemod-700x379.png\" alt=\"\" class=\"wp-image-14572\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_mazemod-700x379.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_mazemod-300x162.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_mazemod-150x81.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_mazemod.png 963w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n<p><!--StartFragment--><\/p>\n\n\n<p>Oder man setzt den Memory Index Pointer auf 200 statt auf 21A? Dann werden die ersten vier Byte einmal als zwei Befehle, einmals als Sprite interpretiert.<\/p>\n\n\n\n<p>Vielleicht kommt man mal so weit mit einer 12. Klasse? Da macht man Maschinensprache, aber typische Aufgaben wie Multiplikation durch wiederholte Addition und solche Sachen.<\/p>\n\n\n\n<p><em>Anhang:<\/em> Warum macht man das so umst\u00e4ndlich, mit 3201 statt &#8222;if (v2==0)&#8220;, wie man das aus Java kennt? Tats\u00e4chlich sind diese Zahlen die einzige Sprache, die ein Prozessor versteht, auch heute noch. Alles andere, das auf einem Rechner l\u00e4uft, wird &#8211; vielleicht \u00fcber mehrere Zwischenstufen &#8211; in genau solche Zahlen \u00fcbersetzt, also in Maschinensprache. Allerdings sind moderne Prozessoren in manchen Aspekten komplexer aufgebaut als der recht primitive CHIP-8.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(6 Kommentare.) Stehen geblieben waren wir bei diesem Computerprogramm f\u00fcr den CHIP-8: A2 1E C2 01 32 01 A2 1A D0 14 70 04 30 40 12 00 60 00 71 04 31 20 12 00 12 18 80 40 20 10 20 40 80 10 Es erzeugt ein Zufallslabyrinth so wie dieses hier: Wie [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":14572,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227],"class_list":["post-14539","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/chip8_mazemod.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/14539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=14539"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/14539\/revisions"}],"predecessor-version":[{"id":55641,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/14539\/revisions\/55641"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/14572"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=14539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=14539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=14539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}