Chip8 Emulator | Hexzahl wird möglicherweise falsch ausgelesen
-
Hallo C++-Forum,
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).
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:
Speicher:
char memory[4096]:[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
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)
unsigned short opcode = 0; std::cout << "Opcodes:" << std::endl; std::cout << std::hex; for (int pc = 0; pc < 10;) { opcode = memory[pc] << 8; //aktuelles Byte nach links schieben opcode = opcode | memory[pc + 1]; //Nächstes Byte an opcode anhängen std::cout << "Opcode: " << opcode << std::endl; pc += 2; //Zwei Bytes weiterschalten std::cin.get(); }
Ausgabe:
Opcode: 6a02 Opcode: 6b0c Opcode: 6c3f Opcode: 6d0c Opcode: ffea << Was ist hier passiert? (FF sollte nicht sein)
Hab ich etwas nicht beachtet? (getestet unter Visual Studio 2013 und Eclipse + MinGW | Windows 8.1 Pro)
-
Also irgendwas stimmt mit deinem Programm nicht. Der Speicher ist vermutlich nicht
unsigned short
, sondernchar
. Mitunsigned short
funktioniert die Zeigerarithmetik in deiner Schleife jedenfalls nicht, da du nie byteweise arbeitest, sondern immer wortweise.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.
-
Danke, hab den Beitrag ausgebessert, da der Speicher wirklich char ist. Ich war wohl gedanklich woanders.
-
Und? Was sagen LSB und MSB zum 5. WORD?
-
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