0

So habe ich diesen Code für meinen Emulator, die ByteWarum gibt meine bitweise Operation 0 in meinem Emulator zurück?

byteToHex(opcode) { 
     var tempCode = (opcode).toString(16).toUpperCase() 
     var addln = 4 - tempCode.length 
     var pad ="" 
     for(var i = 0; i< addln; i++) { 
      pad = pad + "0" 
     } 
     var newCode = "0x"+ pad + tempCode 
     return newCode; 
} 

verhexen wandelt, und ich habe diesen Code, der eine bitweise op tut einen Opcode wandelt sie dann für die Verwendung zu erhalten.

this.opcode = (this.memory[this.pc] << 8) | this.memory[this.pc + 1] 
    console.log(this.memory) 
    console.log("before conversion", this.opcode) 
    this.opcode = this.byteToHex(this.opcode) 
    console.log(this.opcode) 
    //this just returns the first 'letter' of the opcode 
    switch (this.opcode & 0xF000)... 

Dies ist die Ausgabe der Konsole

Array [ 240, 144, 144, 144, 240, 32, 96, 32, 32, 112, 70 more… ] 
before conversion 0 
0x0000 

Das bedeutet, ich bin den Opcode falsch bekommen, aber ich weiß nicht, wie es zu beheben. Für eine bessere Perspektive auf das Projekt: Github

Antwort

1

Hier ist ein Code, der wie erwartet funktioniert. Es ist ein wenig schwierig, Ihren (unvollständigen) Code zu debuggen. Da Stackoverflow über konkrete Fragen und Antworten, ich werde nicht einmal die Mühe, das erraten/Detektivspiel zu spielen brauchte nur zu arbeiten, wo Sie falsch gehen ..

240d = 0xF0

144d = 0x90

[240, 144] behandelt, als eine einzelne 16-Bit-big-endian-Nummer wird 0xF090 (Intel Material wird little-endian, dh niedrigstwertige Byte zuerst kommt)

window.addEventListener('load', onDocLoaded, false); 
 

 
var memoryContents = [240, 144, 144, 144, 240, 32, 96, 32, 32, 112]; 
 

 
function getTwoLocationsBigEndian(indexOfFirst) 
 
{ 
 
\t var result = (memoryContents[indexOfFirst] << 8) | (memoryContents[indexOfFirst+1]); 
 
\t return result; 
 
} 
 

 
function getTwoLocationsLittleEndian(indexOfFirst) 
 
{ 
 
\t var result = (memoryContents[indexOfFirst+1] << 8) | (memoryContents[indexOfFirst]); 
 
\t return result; 
 
} 
 

 
function byteToHex(opcode) 
 
{ 
 
\t var tempCode = (opcode).toString(16).toUpperCase() 
 
\t var addln = 4 - tempCode.length 
 
\t var pad ="" 
 
\t for(var i = 0; i< addln; i++) 
 
\t { 
 
\t \t pad = pad + "0" 
 
\t } 
 
\t var newCode = "0x"+ pad + tempCode 
 
\t return newCode; 
 
} 
 

 
function onDocLoaded(evt) 
 
{ 
 
\t console.log("Memory contents: " + memoryContents); 
 
\t 
 
\t var opcode = getTwoLocationsBigEndian(0); 
 
\t console.log("***** BIG endian *****"); 
 
\t console.log("First 2 locs as a 16bit num (dec): " + opcode); 
 
\t console.log("First 2 locs as a 16bit num (hex): " + byteToHex(opcode)); 
 

 
\t opcode = getTwoLocationsLittleEndian(0); 
 
\t console.log("***** LITTLE endian *****"); 
 
\t console.log("First 2 locs as a 16bit num (dec): " + opcode); 
 
\t console.log("First 2 locs as a 16bit num (hex): " + byteToHex(opcode)); 
 
}

+0

Ihr Code funktioniert ... wenn ich ihn auf stackoverflow laufe. Es funktioniert aber nicht für mich ... – Blaze349

+0

Großartig, das ist ein guter erster Schritt. Jetzt scheint es so zu sein, dass du "für mich nicht funktionstüchtig" in etwas Nützliches und Adressierbares erweitern musst. Welche Fehler bekommen Sie in der Konsole, was erwarten Sie als Ergebnis, was erhalten Sie eigentlich? – enhzflep

+1

Vielen Dank für Ihre Antwort. Mein Opcode wird auf 0 gesetzt, bevor er in jedem Zyklus in das bitweise Ergebnis geändert wird. Es ist fast so, als würde die Funktion dem Opcode keinen Wert geben. Es gibt jedoch keine js Fehler. Ich bekomme immer noch 0 und 0x0000. – Blaze349

Verwandte Themen