Debo cargar una ROM que recibe 2 numeros enteros en representacion BCD empaquetado de 2 digitos y devuelve el resultado de una operación entre ambos también en BCD (que en este sentido no importa). El tema de la operación es sencillo, lo que no entiendo es qué es lo que hace el siguiente código de carga inicial:
int cargar(int direccion) {
// se extrae el primer BCD de 1 byte, pero porqué el and y el shiftR ?
bcd1 = (direccion & 65280) >> 8; // porqué un and con 65280 ???
bcd2 = (direccion & 255); // no entiendo porqué
return int2bcd(op(bcd2int(bcd1), bcd2int(bcd2)));
}
int bcd2int(int bcd) {
d1 = (bcd & 240) >> 4; // porqué el and con 240 ?
d2 = bcd & 15; // porqué con 15 ?
return (d1 * 10) + d2;
}
void cargarROM64K() {
for(int i=0; i<256*256; i++)
mem[i] = cargar(i);
}
Salu2
Para extraer los bytes y los nibbles por separado, ponlos en hexadecimal y lo verás mejor.
No soy profesor, pero le doy un 4,5 al que ha escrito eso por poner esas constantes en decimal.
dicho y hecho...no se me había ocurrido cambiar de base (mal yo). En binario se ve mas claro. Estaban en decimal porque las variables eran int...otra cosa para bajar puntaje...
Salu2
Cita de: "ZüNdFoLGe"Estaban en decimal porque las variables eran int...otra cosa para bajar puntaje...
hey! Que tambien se pueden escribir números negativos en hexadecimal, eso no tiene nada que ver. Alguna gente piensa que para trabajar en hexadecimal hay que definir las variables como DWORD, y no es así (me refiero a gente que empieza en esto).
un saludo