summaryrefslogtreecommitdiff
path: root/lib/nes/cartridge.cc
diff options
context:
space:
mode:
authorHannes Schulze <haschu0103@outlook.de>2025-01-27 13:34:21 +0100
committerHannes Schulze <haschu0103@outlook.de>2025-01-27 13:34:21 +0100
commit117f584b3f3d7945732a29848eb6d4ead1f57bee (patch)
tree9335389f8417e642919f25b888be07e3b723cf4a /lib/nes/cartridge.cc
parent211aa79044e776859409ca7fbad104291a494e26 (diff)
refactor iNES parser
Diffstat (limited to 'lib/nes/cartridge.cc')
-rw-r--r--lib/nes/cartridge.cc27
1 files changed, 9 insertions, 18 deletions
diff --git a/lib/nes/cartridge.cc b/lib/nes/cartridge.cc
index 6a60741..bd8e7d3 100644
--- a/lib/nes/cartridge.cc
+++ b/lib/nes/cartridge.cc
@@ -17,41 +17,32 @@ namespace nes
auto res = cartridge{ status::success };
// Parse header.
- if (length < 16) { return cartridge{ status::error_invalid_ines_data }; }
- if (bytes[0] != 'N' || bytes[1] != 'E' || bytes[2] != 'S' || bytes[3] != 0x1A)
+ if (length < header_length) { return cartridge{ status::error_invalid_ines_data }; }
+ auto const h = header{ bytes };
+ if (h.get_magic_0() != 'N' || h.get_magic_1() != 'E' || h.get_magic_2() != 'S' || h.get_magic_3() != 0x1A)
{
return cartridge{ status::error_invalid_ines_data };
}
- auto const prg_rom_banks = bytes[4];
- auto const chr_rom_banks = bytes[5];
- auto const control_1 = bytes[6];
- auto const control_2 = bytes[7];
- auto const ram_banks = (bytes[8] != 0) ? bytes[8] : 1u;
- auto const has_trainer = (control_1 & 0b00000100) != 0;
- auto const mapper_number = static_cast<std::uint8_t>(
- (control_1 & 0b11110000) >> 4 |
- (control_2 & 0b11110000) >> 0);
+ auto const mapper_number = static_cast<std::uint8_t>((h.get_mapper_high() << 4) | (h.get_mapper_low() << 0));
res.mapper_ = &mapper::get(mapper_number);
- res.name_table_arrangement_ = (control_1 & 0b00000001) != 0
- ? name_table_arrangement::vertical
- : name_table_arrangement::horizontal;
+ res.name_table_arrangement_ = h.get_name_table_arrangement();
// Load program data.
auto offset = std::size_t{ 16 };
- if (has_trainer) { offset += 512; }
+ if (h.get_has_trainer()) { offset += 512; }
- auto const prg_rom_size = prg_rom_banks * prg_rom_bank_size;
+ auto const prg_rom_size = h.get_prg_rom_banks() * prg_rom_bank_size;
if (length < offset + prg_rom_size) { return cartridge{ status::error_invalid_ines_data }; }
res.prg_rom_ = std::vector(&bytes[offset], &bytes[offset + prg_rom_size]);
offset += prg_rom_size;
- auto const chr_rom_size = chr_rom_banks * chr_rom_bank_size;
+ auto const chr_rom_size = h.get_chr_rom_banks() * chr_rom_bank_size;
if (length < offset + chr_rom_size) { return cartridge{ status::error_invalid_ines_data }; }
res.chr_rom_ = std::vector(&bytes[offset], &bytes[offset + chr_rom_size]);
- res.ram_ = std::vector(ram_banks * ram_bank_size, std::uint8_t{ 0 });
+ res.ram_ = std::vector(std::max(h.get_ram_banks(), 1u) * ram_bank_size, std::uint8_t{ 0 });
if (auto const status = res.get_mapper().validate(res); status != status::success)
{