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 , sondern char . Mit unsigned 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 🙂


Log in to reply