0

J'ai donc ce code pour mon émulateur qui convertit l'octet HexPourquoi mon opération bit à bit renvoie 0 dans mon émulateur?

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; 
} 

Et j'ai ce code qui fait un op bitwise pour obtenir un opcode convertit ensuite pour une utilisation.

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)... 

C'est la sortie de la console

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

Cela signifie que je reçois le opcode mal mais je ne sais pas comment le résoudre. Pour une meilleure perspective sur le projet: Github

Répondre

1

Voici du code qui fonctionne comme prévu. C'est un peu difficile de déboguer votre code (incomplet). Depuis StackOverflow est des questions et des réponses concrètes, je ne vais même pas à se soucier de jouer le deviner/jeu de détective nécessaire pour travailler là où vous allez mal ..

240d = 0xF0

144d = 0x90

[240, 144] traité comme un seul numéro big-endian 16 bits est 0xF090 (substance Intel est peu endian, octet-à-dire le moins significatif vient en premier)

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

Votre code fonctionne ... quand je l'exécute sur stackoverflow. Ça ne marche pas pour moi ... – Blaze349

+0

Super, c'est un bon premier pas. Maintenant, il semble que vous deviez étendre "ne fonctionne pas pour moi" en quelque chose d'utile et capable d'être adressée. Quelles erreurs obtenez-vous dans la console, qu'attendez-vous en conséquence, qu'obtenez-vous en conséquence? – enhzflep

+1

Merci d'avoir répondu. Mon opcode est mis à 0 avant d'être changé au résultat bitwise chaque cycle. C'est presque comme si la fonction ne donnait aucune valeur à l'opcode. Il n'y a pas d'erreurs js cependant. Je reçois toujours 0 et 0x0000 à la suite. – Blaze349