@tmustier/pi-nes 0.2.16 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
Binary file
|
|
@@ -118,34 +118,39 @@ impl Mapper for MMC1Mapper {
|
|
|
118
118
|
fn map(&self, address: u32) -> u32 {
|
|
119
119
|
let bank: u32;
|
|
120
120
|
let mut offset = address & 0x3FFF;
|
|
121
|
-
let
|
|
122
|
-
let
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
let prg_low = (self.prg_bank_register.load() as u32) & 0x0F;
|
|
122
|
+
let prg_high = if self.program_bank_num > 16 {
|
|
123
|
+
((self.chr_bank0_register.load() as u32) & 0x10) >> 4
|
|
124
|
+
} else {
|
|
125
|
+
0
|
|
126
|
+
};
|
|
127
|
+
let outer_offset = prg_high * 0x10;
|
|
128
|
+
let bank_num = prg_low;
|
|
126
129
|
|
|
127
130
|
match self.control_register.load_bits(2, 2) {
|
|
128
131
|
0 | 1 => {
|
|
129
132
|
// switch 32KB at 0x8000, ignoring low bit of bank number
|
|
130
133
|
// TODO: Fix me
|
|
131
134
|
offset = offset | (address & 0x4000);
|
|
132
|
-
bank = bank_num & 0x1E;
|
|
135
|
+
bank = outer_offset + (bank_num & 0x1E);
|
|
133
136
|
},
|
|
134
137
|
2 => {
|
|
135
138
|
// fix first bank at 0x8000 and switch 16KB bank at 0xC000
|
|
136
139
|
bank = match address < 0xC000 {
|
|
137
|
-
true =>
|
|
138
|
-
false => bank_num
|
|
140
|
+
true => outer_offset,
|
|
141
|
+
false => outer_offset + bank_num
|
|
139
142
|
};
|
|
140
143
|
},
|
|
141
144
|
_ /*3*/ => {
|
|
142
145
|
// fix last bank at 0xC000 and switch 16KB bank at 0x8000
|
|
143
146
|
bank = match address >= 0xC000 {
|
|
144
|
-
true =>
|
|
145
|
-
false => bank_num
|
|
147
|
+
true => outer_offset + 0x0F,
|
|
148
|
+
false => outer_offset + bank_num
|
|
146
149
|
};
|
|
147
150
|
}
|
|
148
151
|
};
|
|
152
|
+
let max_bank = self.program_bank_num as u32;
|
|
153
|
+
let bank = if max_bank > 0 { bank % max_bank } else { bank };
|
|
149
154
|
bank * 0x4000 + offset
|
|
150
155
|
}
|
|
151
156
|
|