C: Dudas sobre tratar archivos binarios.

Hola, estoy montandome un interprete de NES, llevo un tiempo haciendo ensamblador de 6502. Quisiera saber como tratar el archivo binario de una ROM de NES correctamente.

Me explico, el formato .NES tiene varias partes, en concreto estas:

Byte Contents
---------------------------------------------------------------------------
0-3 String "NES^Z" used to recognize .NES files.
4 Number of 16kB ROM banks.
5 Number of 8kB VROM banks.
6 bit 0 1 for vertical mirroring, 0 for horizontal mirroring.
bit 1 1 for battery-backed RAM at $6000-$7FFF.
bit 2 1 for a 512-byte trainer at $7000-$71FF.
bit 3 1 for a four-screen VRAM layout.
bit 4-7 Four lower bits of ROM Mapper Type.
7 bit 0 1 for VS-System cartridges.
bit 1-3 Reserved, must be zeroes!
bit 4-7 Four higher bits of ROM Mapper Type.
8 Number of 8kB RAM banks. For compatibility with the previous
versions of the .NES format, assume 1x8kB RAM page when this
byte is zero.
9 bit 0 1 for PAL cartridges, otherwise assume NTSC.
bit 1-7 Reserved, must be zeroes!
10-15 Reserved, must be zeroes!
16-... ROM banks, in ascending order. If a trainer is present, its
512 bytes precede the ROM bank contents.
...-EOF VROM banks, in ascending order.
---------------------------------------------------------------------------

El tema es que leer el numero de VROM banks y VRAM banks es facil, se supone que si uso la funcion fopen en modo "rb" voy de byte en byte. El tema es, como puedo interpretar cada bit de ese byte? Necesito saberlo porque al igual que con esto, cuando haga los fetch del opcode tambien lo voy a necesitar.

Gracias
Deberías leer el byte entero, y testear bitfields contra ese byte, algo tal que así:

char cMultiBit = [leer byte];
if(cMultiBit & 0x1 /* Bit 0*/ ) [vertical mirroring]
else [horizontal mirroring]
if(cMultiBit & 0x02 /* Bit 1 */) [battery ram]
if(cMultiBit & 0x04 /* Bit 2 */) [trainer]
if(cMultiBit & 0x08 /* Bit 3 */) [x4 VRam]

etc :)
Espero te sirva de ayuda
1 respuesta