Playing around with reading gameboy roms, and maybe emulation
at main 4.9 kB view raw
1pub enum CartridgeHeaderAddress { 2 // Whole Header 3 CartridgeHeaderStart = 0x0100, 4 CartridgeHeaderEnd = 0x014F, 5 // 0100-0103 — Entry point 6 _EntryPointEnd = 0x0103, 7 // 0104-0133 — Nintendo logo 8 NintendoLogoStart = 0x0104, 9 NintendoLogoEnd = 0x00133, 10 // 0134-0143 — Title 11 TitleStart = 0x0134, 12 TitleEnd = 0x0143, 13 // 013F-0142 — Manufacturer code 14 ManufacturerCodeStart = 0x013F, 15 ManufacturerCodeEnd = 0x0142, 16 // 0144–0145 — New licensee code 17 NewLicenseStart = 0x0144, 18 NewLicenseEnd = 0x0145, 19 // 0146 — SGB flag 20 SgbFlag = 0x0146, 21 // 0147 — Cartridge type 22 CartType = 0x0147, 23 // 0148 — ROM size 24 RomSize = 0x0148, 25 // 0149 - RAM Size, 26 RamSize = 0x0149, 27 // 014A — Destination code 28 DestinationCode = 0x014A, 29 // 014B — Old licensee code 30 OldLicenseeCode = 0x014b, 31 // 014C — Mask ROM version number, 32 MaskRomVersion = 0x014C, 33 // 014D — Header checksum 34 HeaderChecksum = 0x014D, 35 // 014E-014F — Global checksum 36 GlobalChecksumStart = 0x014E, 37 //End is the end of cartheader 38} 39 40pub enum Error { 41 CartridgeReadError, 42 //Nintendo logos do not match 43 NotAValidRom, 44} 45 46pub enum DestinationCode { 47 Japan = 0x00, 48 NotJapan = 0x01, 49} 50 51impl DestinationCode { 52 pub fn from_byte(byte: u8) -> Self { 53 match byte { 54 0x00 => Self::Japan, 55 0x01 | _ => Self::NotJapan, 56 } 57 } 58} 59 60#[derive(Debug)] 61pub enum RamSize { 62 NoRAM = 0x000, 63 Unused = 0x001, 64 Ram8KiB = 0x002, 65 Ram32KiB = 0x003, 66 Ram128KiB = 0x004, 67 Ram64KiB = 0x005, 68} 69 70impl RamSize { 71 pub fn from_byte(byte: u8) -> Self { 72 match byte { 73 0x001 => Self::Unused, 74 0x002 => Self::Ram8KiB, 75 0x003 => Self::Ram32KiB, 76 0x004 => Self::Ram128KiB, 77 0x005 => Self::Ram64KiB, 78 _ => Self::NoRAM, 79 } 80 } 81} 82#[derive(Debug)] 83pub enum CartridgeType { 84 RomOnly = 0x000, 85 MBC1 = 0x001, 86 Mbc1Ram = 0x002, 87 Mbc1RamBattery = 0x003, 88 MBC2 = 0x005, 89 Mbc2Battery = 0x006, 90 RomRam9 = 0x008, 91 RomRamBattery9 = 0x009, 92 MMM01 = 0x00B, 93 Mmm01Ram = 0x00C, 94 Mmm01RamBattery = 0x00D, 95 Mbc3TimerBattery = 0x00F, 96 Mbc3TimerRamBattery10 = 0x010, 97 MBC3 = 0x011, 98 Mbc3Ram10 = 0x012, 99 Mbc3RaBattery10 = 0x013, 100 MBC5 = 0x019, 101 Mbc5Ram = 0x01A, 102 Mbc5RamBattery = 0x01B, 103 Mbc5Rumble = 0x01C, 104 Mbc5RumbleRam = 0x01D, 105 Mbc5RumbleRamBattery = 0x01E, 106 MBC6 = 0x020, 107 Mbc7SensorRumbleRamBattery = 0x022, 108 PocketCamera = 0x0FC, 109 BandaiTama5 = 0x0FD, 110 HuC3 = 0x0FE, 111 HuC1RamBattery = 0x0FF, 112} 113 114impl CartridgeType { 115 pub fn from_byte(byte: u8) -> Self { 116 match byte { 117 0x001 => Self::MBC1, 118 0x002 => Self::Mbc1Ram, 119 0x003 => Self::Mbc1RamBattery, 120 0x005 => Self::MBC2, 121 0x006 => Self::Mbc2Battery, 122 0x008 => Self::RomRam9, 123 0x009 => Self::RomRamBattery9, 124 0x00B => Self::MMM01, 125 0x00C => Self::Mmm01Ram, 126 0x00D => Self::Mmm01RamBattery, 127 0x00F => Self::Mbc3TimerBattery, 128 0x010 => Self::Mbc3TimerRamBattery10, 129 0x011 => Self::MBC3, 130 0x012 => Self::Mbc3Ram10, 131 0x013 => Self::Mbc3RaBattery10, 132 0x019 => Self::MBC5, 133 0x01A => Self::Mbc5Ram, 134 0x01B => Self::Mbc5RamBattery, 135 0x01C => Self::Mbc5Rumble, 136 0x01D => Self::Mbc5RumbleRam, 137 0x01E => Self::Mbc5RumbleRamBattery, 138 0x020 => Self::MBC6, 139 0x022 => Self::Mbc7SensorRumbleRamBattery, 140 0x0FC => Self::PocketCamera, 141 0x0FD => Self::BandaiTama5, 142 0x0FE => Self::HuC3, 143 0x0FF => Self::HuC1RamBattery, 144 0x000 | _ => Self::RomOnly, 145 } 146 } 147} 148 149#[derive(Debug)] 150pub enum RomSize { 151 Rom32KiB = 0x000, 152 Rom64KiB = 0x001, 153 Rom128KiB = 0x002, 154 Rom256KiB = 0x003, 155 Rom512KiB = 0x004, 156 Rom1MiB = 0x005, 157 Rom2MiB = 0x006, 158 Rom4MiB = 0x007, 159 Rom8MiB = 0x008, 160 Rom1_1MiB = 0x052, 161 Rom1_2MiB = 0x053, 162 Rom1_5MiB = 0x054, 163} 164 165impl RomSize { 166 pub fn from_byte(byte: u8) -> Self { 167 match byte { 168 0x001 => Self::Rom64KiB, 169 0x002 => Self::Rom128KiB, 170 0x003 => Self::Rom256KiB, 171 0x004 => Self::Rom512KiB, 172 0x005 => Self::Rom1MiB, 173 0x006 => Self::Rom2MiB, 174 0x007 => Self::Rom4MiB, 175 0x008 => Self::Rom8MiB, 176 0x052 => Self::Rom1_1MiB, 177 0x053 => Self::Rom1_2MiB, 178 0x054 => Self::Rom1_5MiB, 179 0x000 | _ => Self::Rom32KiB, 180 } 181 } 182} 183 184#[derive(Debug)] 185pub enum CGBFlag { 186 SupportsColorBackwardCompatiable, 187 ColorOnly, 188 NotSet, 189}