From b30279bc80a558267f0b22cc1b175c573c8945ae Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 24 Dec 2023 19:29:14 +0100 Subject: [PATCH] Parse cartridge video format (PAL/NTSC) --- src/snes/cartridge.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/snes/cartridge.rs b/src/snes/cartridge.rs index 73991db..7bb884f 100644 --- a/src/snes/cartridge.rs +++ b/src/snes/cartridge.rs @@ -3,6 +3,7 @@ use std::fmt; use num_derive::FromPrimitive; use num_traits::FromPrimitive; use serde::{Deserialize, Serialize}; +use strum::Display; use crate::snes::bus::{Address, BusMember}; @@ -12,11 +13,18 @@ const HDR_MAPMODE_OFFSET: usize = 0x15; const HDR_CHIPSET_OFFSET: usize = 0x16; const HDR_ROMSIZE_OFFSET: usize = 0x17; const HDR_RAMSIZE_OFFSET: usize = 0x18; +const HDR_DESTINATION_OFFSET: usize = 0x19; const HDR_CHECKSUM_OFFSET: usize = 0x1C; const HDR_ICHECKSUM_OFFSET: usize = 0x1E; const HDR_LEN: usize = 0x1F; const RAM_SIZE: usize = 32 * 1024; +#[derive(Display)] +pub enum VideoFormat { + PAL, + NTSC, +} + #[derive(Debug, Clone, Copy, Eq, PartialEq, FromPrimitive)] pub enum Chipset { RomOnly = 0, @@ -85,6 +93,15 @@ impl Cartridge { (1 << self.rom[self.header_offset + HDR_RAMSIZE_OFFSET]) * 1024 } + fn get_video_format(&self) -> VideoFormat { + match self.rom[self.header_offset + HDR_DESTINATION_OFFSET] { + 0 // Japan + | 1 // North-America + => VideoFormat::NTSC, + _ => VideoFormat::PAL + } + } + fn probe_header(hdr: &[u8]) -> bool { let csum1: u16 = (hdr[HDR_CHECKSUM_OFFSET + 0] as u16) | (hdr[HDR_CHECKSUM_OFFSET + 1] as u16) << 8; @@ -169,8 +186,9 @@ impl fmt::Display for Cartridge { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "\"{}\" - {:?} {:?} - {} KB ROM, {} KB RAM", + "\"{}\" {} - {:?} {:?} - {} KB ROM, {} KB RAM", self.get_title(), + self.get_video_format(), self.get_chipset(), self.get_map(), self.get_rom_size() / 1024,