Playing around with reading gameboy roms, and maybe emulation
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}