<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen]]></title><description><![CDATA[<p>Hallo C++-Forum,</p>
<p>ich habe erst kürzlich beschlossen einen kleinen Einblick in die Welt der Emulatoren und der Funktionsweise dieser bekommen zu wollen. Der Einfachheit halber habe ich mit einem Chip8-Emulator begonnen, der als Einstieg ziemlich simpel sein soll (und auch bis jetzt ohne weiteres sich implementieren lassen hat).</p>
<p>Nun ist mir allerdings aufgefallen, dass eben mein Programm mir vorwirft, dass ein ungültiger Opcode im Speicher liegt. Paradoxerweise wurden aber die bisherigen korrekt ausgelesen. Hier die ersten Bytes aus dem emulierten Beispiel:</p>
<p>Speicher:<br />
char memory[4096]:</p>
<pre><code>[0x00000000]	0x6a 'j'	char
[0x00000001]	0x02 '\x2'	char
[0x00000002]	0x6b 'k'	char
[0x00000003]	0x0c '\f'	char
[0x00000004]	0x6c 'l'	char
[0x00000005]	0x3f '?'	char
[0x00000006]	0x6d 'm'	char
[0x00000007]	0x0c '\f'	char
[0x00000008]	0xa2 '¢'	char
[0x00000009]	0xea 'ê'	char
[0x0000000a]	0xda 'Ú'	char
</code></pre>
<p>Ich habe dann einfach nochmal einen kleinen Schnipsel entworfen, der auch dann aus memory liest und die Opcodes anzeigen soll. (Instructions sind 2 Byte groß, deswegen unsigned short)</p>
<pre><code>unsigned short opcode = 0;

	std::cout &lt;&lt; &quot;Opcodes:&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; std::hex;

	for (int pc = 0; pc &lt; 10;)
	{
		opcode = memory[pc] &lt;&lt; 8; //aktuelles Byte nach links schieben
		opcode = opcode | memory[pc + 1]; //Nächstes Byte an opcode anhängen

		std::cout &lt;&lt; &quot;Opcode: &quot; &lt;&lt; opcode &lt;&lt; std::endl;

		pc += 2; //Zwei Bytes weiterschalten
		std::cin.get();
	}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Opcode: 6a02

Opcode: 6b0c

Opcode: 6c3f 

Opcode: 6d0c

Opcode: ffea &lt;&lt; Was ist hier passiert? (FF sollte nicht sein)
</code></pre>
<p>Hab ich etwas nicht beachtet? (getestet unter Visual Studio 2013 und Eclipse + MinGW | Windows 8.1 Pro)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329619/chip8-emulator-hexzahl-wird-möglicherweise-falsch-ausgelesen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 25 May 2026 04:54:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329619.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Dec 2014 10:38:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen on Mon, 01 Dec 2014 15:23:50 GMT]]></title><description><![CDATA[<p>Hallo C++-Forum,</p>
<p>ich habe erst kürzlich beschlossen einen kleinen Einblick in die Welt der Emulatoren und der Funktionsweise dieser bekommen zu wollen. Der Einfachheit halber habe ich mit einem Chip8-Emulator begonnen, der als Einstieg ziemlich simpel sein soll (und auch bis jetzt ohne weiteres sich implementieren lassen hat).</p>
<p>Nun ist mir allerdings aufgefallen, dass eben mein Programm mir vorwirft, dass ein ungültiger Opcode im Speicher liegt. Paradoxerweise wurden aber die bisherigen korrekt ausgelesen. Hier die ersten Bytes aus dem emulierten Beispiel:</p>
<p>Speicher:<br />
char memory[4096]:</p>
<pre><code>[0x00000000]	0x6a 'j'	char
[0x00000001]	0x02 '\x2'	char
[0x00000002]	0x6b 'k'	char
[0x00000003]	0x0c '\f'	char
[0x00000004]	0x6c 'l'	char
[0x00000005]	0x3f '?'	char
[0x00000006]	0x6d 'm'	char
[0x00000007]	0x0c '\f'	char
[0x00000008]	0xa2 '¢'	char
[0x00000009]	0xea 'ê'	char
[0x0000000a]	0xda 'Ú'	char
</code></pre>
<p>Ich habe dann einfach nochmal einen kleinen Schnipsel entworfen, der auch dann aus memory liest und die Opcodes anzeigen soll. (Instructions sind 2 Byte groß, deswegen unsigned short)</p>
<pre><code>unsigned short opcode = 0;

	std::cout &lt;&lt; &quot;Opcodes:&quot; &lt;&lt; std::endl;
	std::cout &lt;&lt; std::hex;

	for (int pc = 0; pc &lt; 10;)
	{
		opcode = memory[pc] &lt;&lt; 8; //aktuelles Byte nach links schieben
		opcode = opcode | memory[pc + 1]; //Nächstes Byte an opcode anhängen

		std::cout &lt;&lt; &quot;Opcode: &quot; &lt;&lt; opcode &lt;&lt; std::endl;

		pc += 2; //Zwei Bytes weiterschalten
		std::cin.get();
	}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Opcode: 6a02

Opcode: 6b0c

Opcode: 6c3f 

Opcode: 6d0c

Opcode: ffea &lt;&lt; Was ist hier passiert? (FF sollte nicht sein)
</code></pre>
<p>Hab ich etwas nicht beachtet? (getestet unter Visual Studio 2013 und Eclipse + MinGW | Windows 8.1 Pro)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430490</guid><dc:creator><![CDATA[Spacemuck]]></dc:creator><pubDate>Mon, 01 Dec 2014 15:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen on Mon, 01 Dec 2014 14:17:06 GMT]]></title><description><![CDATA[<p>Also irgendwas stimmt mit deinem Programm nicht. Der Speicher ist vermutlich nicht <code>unsigned short</code> , sondern <code>char</code> . Mit <code>unsigned short</code> funktioniert die Zeigerarithmetik in deiner Schleife jedenfalls nicht, da du nie byteweise arbeitest, sondern immer wortweise.</p>
<p>Bau doch eine temporäre Variable zum Debuggen ein, die dir das MSB und LSB anzeigen, damit solltest du dein Problem schnell in den Griff kriegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430529</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 01 Dec 2014 14:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen on Mon, 01 Dec 2014 15:25:12 GMT]]></title><description><![CDATA[<p>Danke, hab den Beitrag ausgebessert, da der Speicher wirklich char ist. Ich war wohl gedanklich woanders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430543</guid><dc:creator><![CDATA[Spacemuck]]></dc:creator><pubDate>Mon, 01 Dec 2014 15:25:12 GMT</pubDate></item><item><title><![CDATA[Reply to Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen on Tue, 02 Dec 2014 15:44:05 GMT]]></title><description><![CDATA[<p>Und? Was sagen LSB und MSB zum 5. WORD?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430757</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 02 Dec 2014 15:44:05 GMT</pubDate></item><item><title><![CDATA[Reply to Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen on Tue, 02 Dec 2014 22:22:17 GMT]]></title><description><![CDATA[<p>Ach fast vergessen: das LSB war auf 0 gesetzt und das MSB war gesetzt. Des rätsels Lösung war der Datentyp unsigned (also wegen dem Vorzeichen). Demzufolge wurde memory jetzt auf unsigned char gesetzt und das Problem ist gelöst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430835</guid><dc:creator><![CDATA[Spacemuck]]></dc:creator><pubDate>Tue, 02 Dec 2014 22:22:17 GMT</pubDate></item></channel></rss>