diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2025-01-27 13:34:21 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2025-01-27 13:34:21 +0100 |
| commit | 117f584b3f3d7945732a29848eb6d4ead1f57bee (patch) | |
| tree | 9335389f8417e642919f25b888be07e3b723cf4a /lib/nes/cartridge.cc | |
| parent | 211aa79044e776859409ca7fbad104291a494e26 (diff) | |
refactor iNES parser
Diffstat (limited to 'lib/nes/cartridge.cc')
| -rw-r--r-- | lib/nes/cartridge.cc | 27 |
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) { |
