|
1
|
|
package com.rox.cartridge; |
|
2
|
|
|
|
3
|
|
import com.rox.mem.RAM; |
|
4
|
|
|
|
5
|
|
import java.util.LinkedHashMap; |
|
6
|
|
import java.util.Map; |
|
7
|
|
|
|
8
|
|
import static com.rox.ByteUtil.BYTE_MASK; |
|
9
|
|
|
|
10
|
|
/** |
|
11
|
|
* iNES mapper 1 (MMC1). Every write to {@code $8000-$FFFF} feeds one bit (the value's bit 0) into a |
|
12
|
|
* 5-bit serial shift register, LSB first; on the 5th write, the assembled 5-bit value latches into |
|
13
|
|
* one of four internal registers, chosen by which address range that 5th write landed in: |
|
14
|
|
* {@code $8000-$9FFF} control, {@code $A000-$BFFF} CHR bank 0, {@code $C000-$DFFF} CHR bank 1, |
|
15
|
|
* {@code $E000-$FFFF} PRG bank. A write with bit 7 set doesn't shift at all - it immediately resets |
|
16
|
|
* the shift register and forces the control register's PRG bank mode to 3 (switch $8000, fix the |
|
17
|
|
* last bank at $C000), matching real hardware's power-on/reset state. |
|
18
|
|
* |
|
19
|
|
* PRG-ROM bank modes (control register bits 2-3): 0 and 1 both mean "switch a 32KB bank at $8000" |
|
20
|
|
* (the PRG bank register's bit 0 is ignored - the whole window moves as one 32KB unit); 2 fixes bank |
|
21
|
|
* 0 at $8000 and switches a 16KB bank at $C000; 3 switches a 16KB bank at $8000 and fixes the last |
|
22
|
|
* bank at $C000 (the reset state). 8KB PRG-RAM at $6000-$7FFF, always writable - this codebase |
|
23
|
|
* doesn't model the PRG-RAM chip-enable bit some MMC1 revisions (B2+) add to the PRG bank register. |
|
24
|
|
* |
|
25
|
|
* CHR (control register bit 4, {@link #CHR_MODE_BIT}): 0 = 8KB mode, one bank switched by |
|
26
|
|
* {@link #chrBank0Register()} with its bit 0 ignored (the whole 8KB window moves as one unit, |
|
27
|
|
* mirroring how PRG bank modes 0/1 ignore the PRG bank register's own bit 0); 1 = 4KB mode, two |
|
28
|
|
* independently-switched 4KB banks, one per CHR bank register. CHR-RAM boards (no CHR-ROM in the |
|
29
|
|
* file) get a single fixed 8KB RAM bank instead - real MMC1+CHR-RAM boards don't bank CHR-RAM either, |
|
30
|
|
* so the bank registers are simply ignored in that case. Mirroring is read dynamically from the |
|
31
|
|
* control register's low 2 bits on every call (0/1 = fixed single-screen lower/upper, 2 = vertical, |
|
32
|
|
* 3 = horizontal) - this overrides the iNES header's mirroring bit, real MMC1 hardware behaviour. |
|
33
|
|
* |
|
34
|
|
* Simplifications: the extended >256KB SUROM/SOROM addressing scheme, which repurposes CHR bank |
|
35
|
|
* register bits as extra PRG bank bits, isn't modeled - not needed for any ROM this codebase |
|
36
|
|
* currently loads. |
|
37
|
|
*/ |
|
38
|
|
public final class Mmc1Mapper implements Mapper { |
|
39
|
|
private static final int PRG_RAM_SIZE = 0x2000; |
|
40
|
|
private static final int PRG_ROM_START_ADDRESS = 0x8000; |
|
41
|
|
private static final int PRG_BANK_SIZE = 0x4000; |
|
42
|
|
private static final int CHR_BANK_0_START_ADDRESS = 0xA000; |
|
43
|
|
private static final int CHR_BANK_1_START_ADDRESS = 0xC000; |
|
44
|
|
private static final int PRG_BANK_REGISTER_START_ADDRESS = 0xE000; |
|
45
|
|
private static final int CHR_WINDOW_SIZE = 0x2000; |
|
46
|
|
private static final int CHR_BANK_4KB_SIZE = 0x1000; |
|
47
|
|
private static final int CHR_MODE_BIT = 0x10; |
|
48
|
|
private static final int CHR_BANK_NUMBER_MASK = 0x1F; |
|
49
|
|
private static final int MIRRORING_MODE_MASK = 0x03; |
|
50
|
|
|
|
51
|
|
private static final int RESET_BIT = 0x80; |
|
52
|
|
private static final int SHIFTS_PER_LATCH = 5; |
|
53
|
|
private static final int RESET_PRG_BANK_MODE_BITS = 0x0C; |
|
54
|
|
|
|
55
|
|
private static final int PRG_BANK_MODE_SHIFT = 2; |
|
56
|
|
private static final int PRG_BANK_MODE_MASK = 0x03; |
|
57
|
|
private static final int PRG_BANK_MODE_SWITCH_32KB_HIGH = 1; |
|
58
|
|
private static final int PRG_BANK_MODE_FIX_FIRST = 2; |
|
59
|
|
private static final int PRG_BANK_NUMBER_MASK = 0x0F; |
|
60
|
|
|
|
61
|
|
private final byte[] prgRom; |
|
62
|
|
private final RAM prgRam = new RAM(PRG_RAM_SIZE, "PRG-RAM"); |
|
63
|
|
private final ChrMemory chr; |
|
64
|
|
|
|
65
|
|
private int shiftRegister; |
|
66
|
|
private int shiftCount; |
|
67
|
|
|
|
68
|
|
private int controlRegister = RESET_PRG_BANK_MODE_BITS; //power-on: PRG mode 3 |
|
69
|
|
private int chrBank0Register; |
|
70
|
|
private int chrBank1Register; |
|
71
|
|
private int prgBankRegister; |
|
72
|
|
|
|
73
|
|
public Mmc1Mapper(final INesRom rom){ |
|
74
|
|
this.prgRom = rom.prgRom(); |
|
75
|
1
1. <init> : negated conditional → KILLED
|
if (prgRom.length == 0){ |
|
76
|
|
throw new IllegalArgumentException("MMC1 requires at least one 16KB PRG-ROM bank"); |
|
77
|
|
} |
|
78
|
|
this.chr = ChrMemory.of(rom, CHR_WINDOW_SIZE); |
|
79
|
|
} |
|
80
|
|
|
|
81
|
|
/** Contract: only ever called with {@code address} in {@code $6000-$FFFF} (see class Javadoc). */ |
|
82
|
|
@Override |
|
83
|
|
public int read(final int address){ |
|
84
|
2
1. read : changed conditional boundary → KILLED
2. read : negated conditional → KILLED
|
if (address >= PRG_ROM_START_ADDRESS){ |
|
85
|
2
1. read : Replaced bitwise AND with OR → KILLED
2. read : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::read → KILLED
|
return prgRom[prgRomOffset(address)] & BYTE_MASK; |
|
86
|
|
} |
|
87
|
1
1. read : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::read → KILLED
|
return prgRam.read(address); |
|
88
|
|
} |
|
89
|
|
|
|
90
|
|
/** Contract: only ever called with {@code address} in {@code $6000-$FFFF} (see class Javadoc). */ |
|
91
|
|
@Override |
|
92
|
|
public void write(final int address, final int value){ |
|
93
|
2
1. write : changed conditional boundary → KILLED
2. write : negated conditional → KILLED
|
if (address < PRG_ROM_START_ADDRESS){ |
|
94
|
1
1. write : removed call to com/rox/mem/RAM::write → KILLED
|
prgRam.write(address, value); |
|
95
|
|
return; |
|
96
|
|
} |
|
97
|
2
1. write : negated conditional → KILLED
2. write : Replaced bitwise AND with OR → KILLED
|
if ((value & RESET_BIT) != 0){ |
|
98
|
|
shiftRegister = 0; |
|
99
|
|
shiftCount = 0; |
|
100
|
1
1. write : Replaced bitwise OR with AND → KILLED
|
controlRegister |= RESET_PRG_BANK_MODE_BITS; |
|
101
|
|
return; |
|
102
|
|
} |
|
103
|
3
1. write : Replaced Shift Left with Shift Right → KILLED
2. write : Replaced bitwise OR with AND → KILLED
3. write : Replaced bitwise AND with OR → KILLED
|
shiftRegister |= (value & 1) << shiftCount; |
|
104
|
1
1. write : Replaced integer addition with subtraction → KILLED
|
shiftCount++; |
|
105
|
1
1. write : negated conditional → KILLED
|
if (shiftCount == SHIFTS_PER_LATCH){ |
|
106
|
1
1. write : removed call to com/rox/cartridge/Mmc1Mapper::latch → KILLED
|
latch(address, shiftRegister); |
|
107
|
|
shiftRegister = 0; |
|
108
|
|
shiftCount = 0; |
|
109
|
|
} |
|
110
|
|
} |
|
111
|
|
|
|
112
|
|
private void latch(final int address, final int value){ |
|
113
|
2
1. latch : negated conditional → KILLED
2. latch : changed conditional boundary → KILLED
|
if (address < CHR_BANK_0_START_ADDRESS){ |
|
114
|
|
controlRegister = value; |
|
115
|
2
1. latch : changed conditional boundary → KILLED
2. latch : negated conditional → KILLED
|
} else if (address < CHR_BANK_1_START_ADDRESS){ |
|
116
|
|
chrBank0Register = value; |
|
117
|
2
1. latch : negated conditional → KILLED
2. latch : changed conditional boundary → KILLED
|
} else if (address < PRG_BANK_REGISTER_START_ADDRESS){ |
|
118
|
|
chrBank1Register = value; |
|
119
|
|
} else { |
|
120
|
|
prgBankRegister = value; |
|
121
|
|
} |
|
122
|
|
} |
|
123
|
|
|
|
124
|
|
/** |
|
125
|
|
* <ul> |
|
126
|
|
* <li>$8000-$FFFF is a fixed 32KB CPU window, but MMC1 PRG-ROM can be up to 512KB.</li> |
|
127
|
|
* </ul> |
|
128
|
|
* The extra ROM doesn't fit in the window, so the game writes to a bank-select register (via the 5-bit |
|
129
|
|
* shift-register protocol you can see in write()/latch()) to say make a given chunk of the ROM |
|
130
|
|
* visible in the window. |
|
131
|
|
* |
|
132
|
|
* @param address to translate from CPU 32KB addressable size |
|
133
|
|
* @return address in addressable 512KB based on state of bank-select register state |
|
134
|
|
*/ |
|
135
|
|
private int prgRomOffset(final int address){ |
|
136
|
1
1. prgRomOffset : Replaced integer subtraction with addition → KILLED
|
final int windowOffset = address - PRG_ROM_START_ADDRESS; //0..0x7FFF |
|
137
|
1
1. prgRomOffset : Replaced integer division with multiplication → KILLED
|
final int totalBanks = prgRom.length / PRG_BANK_SIZE; |
|
138
|
2
1. prgRomOffset : Replaced Shift Right with Shift Left → KILLED
2. prgRomOffset : Replaced bitwise AND with OR → KILLED
|
final int prgBankMode = (controlRegister >> PRG_BANK_MODE_SHIFT) & PRG_BANK_MODE_MASK; |
|
139
|
1
1. prgRomOffset : Replaced bitwise AND with OR → KILLED
|
final int bankNumber = prgBankRegister & PRG_BANK_NUMBER_MASK; |
|
140
|
|
|
|
141
|
2
1. prgRomOffset : negated conditional → KILLED
2. prgRomOffset : changed conditional boundary → KILLED
|
if (prgBankMode <= PRG_BANK_MODE_SWITCH_32KB_HIGH){ |
|
142
|
3
1. prgRomOffset : Replaced integer division with multiplication → SURVIVED
2. prgRomOffset : Replaced integer modulus with multiplication → KILLED
3. prgRomOffset : Replaced Shift Right with Shift Left → KILLED
|
final int bank32 = (bankNumber >> 1) % Math.max(1, totalBanks / 2); |
|
143
|
|
//mirrors a single-bank (16KB) ROM across the 32KB window, same as NromMapper's own |
|
144
|
|
//16KB-bank mirroring - a lone-bank MMC1 image is nonstandard but shouldn't crash |
|
145
|
4
1. prgRomOffset : Replaced integer addition with subtraction → KILLED
2. prgRomOffset : Replaced integer modulus with multiplication → KILLED
3. prgRomOffset : Replaced integer multiplication with division → KILLED
4. prgRomOffset : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgRomOffset → KILLED
|
return (bank32 * (PRG_BANK_SIZE * 2) + windowOffset) % prgRom.length; |
|
146
|
|
} |
|
147
|
2
1. prgRomOffset : negated conditional → KILLED
2. prgRomOffset : changed conditional boundary → KILLED
|
if (windowOffset < PRG_BANK_SIZE){ |
|
148
|
2
1. prgRomOffset : negated conditional → KILLED
2. prgRomOffset : Replaced integer modulus with multiplication → KILLED
|
final int bank = prgBankMode == PRG_BANK_MODE_FIX_FIRST ? 0 : bankNumber % totalBanks; |
|
149
|
3
1. prgRomOffset : Replaced integer addition with subtraction → KILLED
2. prgRomOffset : Replaced integer multiplication with division → KILLED
3. prgRomOffset : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgRomOffset → KILLED
|
return bank * PRG_BANK_SIZE + windowOffset; |
|
150
|
|
} |
|
151
|
3
1. prgRomOffset : Replaced integer subtraction with addition → KILLED
2. prgRomOffset : negated conditional → KILLED
3. prgRomOffset : Replaced integer modulus with multiplication → KILLED
|
final int bank = prgBankMode == PRG_BANK_MODE_FIX_FIRST ? bankNumber % totalBanks : totalBanks - 1; |
|
152
|
4
1. prgRomOffset : Replaced integer addition with subtraction → KILLED
2. prgRomOffset : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgRomOffset → KILLED
3. prgRomOffset : Replaced integer multiplication with division → KILLED
4. prgRomOffset : Replaced integer subtraction with addition → KILLED
|
return bank * PRG_BANK_SIZE + (windowOffset - PRG_BANK_SIZE); |
|
153
|
|
} |
|
154
|
|
|
|
155
|
|
@Override |
|
156
|
|
public int readChr(final int address){ |
|
157
|
1
1. readChr : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::readChr → KILLED
|
return chr.read(chrOffset(address)); |
|
158
|
|
} |
|
159
|
|
|
|
160
|
|
/** |
|
161
|
|
* This is a no-op if Chr is ROM/Read-Only |
|
162
|
|
*/ |
|
163
|
|
@Override |
|
164
|
|
public void writeChr(final int address, final int value){ |
|
165
|
1
1. writeChr : removed call to com/rox/cartridge/ChrMemory::write → KILLED
|
chr.write(chrOffset(address), value); |
|
166
|
|
} |
|
167
|
|
|
|
168
|
|
/** CHR-RAM is one fixed 8KB bank (see class doc); only CHR-ROM is banked. */ |
|
169
|
|
private int chrOffset(final int address){ |
|
170
|
3
1. chrOffset : negated conditional → KILLED
2. chrOffset : Replaced bitwise AND with OR → KILLED
3. chrOffset : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrOffset → KILLED
|
return chr.isRam() ? address & (CHR_WINDOW_SIZE - 1) : chrRomOffset(address); |
|
171
|
|
} |
|
172
|
|
|
|
173
|
|
/** |
|
174
|
|
* <ul> |
|
175
|
|
* <li>$0000-$1FFF is a fixed 8KB PPU window, but CHR-ROM can be up to 128KB.</li> |
|
176
|
|
* </ul> |
|
177
|
|
* The extra ROM doesn't fit in the window, so the game writes to a bank-select register (via the 5-bit |
|
178
|
|
* shift-register protocol you can see in write()/latch()) to say make a given chunk of the ROM |
|
179
|
|
* visible in the window. |
|
180
|
|
* |
|
181
|
|
* @param address to translate from PPU 8KB addressable size |
|
182
|
|
* @return address in addressable 128KB based on state of bank-select register state |
|
183
|
|
*/ |
|
184
|
|
private int chrRomOffset(final int address){ |
|
185
|
2
1. chrRomOffset : negated conditional → KILLED
2. chrRomOffset : Replaced bitwise AND with OR → KILLED
|
final boolean fourKbMode = (controlRegister & CHR_MODE_BIT) != 0; |
|
186
|
1
1. chrRomOffset : Replaced integer division with multiplication → SURVIVED
|
final int totalFourKbBanks = chr.size() / CHR_BANK_4KB_SIZE; |
|
187
|
1
1. chrRomOffset : negated conditional → KILLED
|
if (!fourKbMode){ |
|
188
|
3
1. chrRomOffset : Replaced integer division with multiplication → SURVIVED
2. chrRomOffset : Replaced Shift Right with Shift Left → KILLED
3. chrRomOffset : Replaced integer modulus with multiplication → KILLED
|
final int bank8kb = (chrBank0Register >> 1) % Math.max(1, totalFourKbBanks / 2); |
|
189
|
4
1. chrRomOffset : Replaced integer multiplication with division → KILLED
2. chrRomOffset : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrRomOffset → KILLED
3. chrRomOffset : Replaced integer modulus with multiplication → KILLED
4. chrRomOffset : Replaced integer addition with subtraction → KILLED
|
return (bank8kb * CHR_WINDOW_SIZE + address) % chr.size(); |
|
190
|
|
} |
|
191
|
2
1. chrRomOffset : negated conditional → KILLED
2. chrRomOffset : changed conditional boundary → KILLED
|
final int bankRegister = address < CHR_BANK_4KB_SIZE ? chrBank0Register : chrBank1Register; |
|
192
|
2
1. chrRomOffset : Replaced integer modulus with multiplication → KILLED
2. chrRomOffset : Replaced bitwise AND with OR → KILLED
|
final int bank = (bankRegister & CHR_BANK_NUMBER_MASK) % totalFourKbBanks; |
|
193
|
5
1. chrRomOffset : Replaced bitwise AND with OR → KILLED
2. chrRomOffset : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrRomOffset → KILLED
3. chrRomOffset : Replaced integer modulus with multiplication → KILLED
4. chrRomOffset : Replaced integer addition with subtraction → KILLED
5. chrRomOffset : Replaced integer multiplication with division → KILLED
|
return (bank * CHR_BANK_4KB_SIZE + (address & (CHR_BANK_4KB_SIZE - 1))) % chr.size(); |
|
194
|
|
} |
|
195
|
|
|
|
196
|
|
@Override |
|
197
|
|
public Mirroring nametableMirroring(){ |
|
198
|
2
1. nametableMirroring : Replaced bitwise AND with OR → KILLED
2. nametableMirroring : replaced return value with null for com/rox/cartridge/Mmc1Mapper::nametableMirroring → KILLED
|
return switch (controlRegister & MIRRORING_MODE_MASK){ |
|
199
|
|
case 0 -> Mirroring.SINGLE_SCREEN_LOWER; |
|
200
|
|
case 1 -> Mirroring.SINGLE_SCREEN_UPPER; |
|
201
|
|
case 2 -> Mirroring.VERTICAL; |
|
202
|
|
default -> Mirroring.HORIZONTAL; |
|
203
|
|
}; |
|
204
|
|
} |
|
205
|
|
|
|
206
|
|
int controlRegister(){ |
|
207
|
1
1. controlRegister : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::controlRegister → KILLED
|
return controlRegister; |
|
208
|
|
} |
|
209
|
|
|
|
210
|
|
int chrBank0Register(){ |
|
211
|
1
1. chrBank0Register : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrBank0Register → KILLED
|
return chrBank0Register; |
|
212
|
|
} |
|
213
|
|
|
|
214
|
|
int chrBank1Register(){ |
|
215
|
1
1. chrBank1Register : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrBank1Register → KILLED
|
return chrBank1Register; |
|
216
|
|
} |
|
217
|
|
|
|
218
|
|
int prgBankRegister(){ |
|
219
|
1
1. prgBankRegister : replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgBankRegister → KILLED
|
return prgBankRegister; |
|
220
|
|
} |
|
221
|
|
|
|
222
|
|
@Override |
|
223
|
|
public Map<String, String> debugState(){ |
|
224
|
|
final Map<String, String> state = new LinkedHashMap<>(); |
|
225
|
|
state.put("Control", String.format("$%02X", controlRegister)); |
|
226
|
|
state.put("CHR bank 0", String.format("$%02X", chrBank0Register)); |
|
227
|
|
state.put("CHR bank 1", String.format("$%02X", chrBank1Register)); |
|
228
|
|
state.put("PRG bank", String.format("$%02X", prgBankRegister)); |
|
229
|
1
1. debugState : replaced return value with Collections.emptyMap for com/rox/cartridge/Mmc1Mapper::debugState → KILLED
|
return state; |
|
230
|
|
} |
|
231
|
|
|
|
232
|
|
@Override |
|
233
|
|
public int[] prgRam(){ |
|
234
|
1
1. prgRam : replaced return value with null for com/rox/cartridge/Mmc1Mapper::prgRam → KILLED
|
return prgRam.snapshot(); |
|
235
|
|
} |
|
236
|
|
|
|
237
|
|
@Override |
|
238
|
|
public void restorePrgRam(final int[] prgRam){ |
|
239
|
1
1. restorePrgRam : removed call to com/rox/mem/RAM::restore → KILLED
|
this.prgRam.restore(prgRam); |
|
240
|
|
} |
|
241
|
|
|
|
242
|
|
@Override |
|
243
|
|
public MapperSnapshot snapshot(){ |
|
244
|
1
1. snapshot : replaced return value with null for com/rox/cartridge/Mmc1Mapper::snapshot → KILLED
|
return new Mmc1MapperSnapshot(prgRam.snapshot(), chr.snapshot(), shiftRegister, shiftCount, |
|
245
|
|
controlRegister, chrBank0Register, chrBank1Register, prgBankRegister); |
|
246
|
|
} |
|
247
|
|
|
|
248
|
|
@Override |
|
249
|
|
public void checkRestorable(final MapperSnapshot snapshot){ |
|
250
|
|
final Mmc1MapperSnapshot mmc1 = SnapshotArrays.expect(snapshot, Mmc1MapperSnapshot.class); |
|
251
|
1
1. checkRestorable : removed call to com/rox/mem/RAM::checkRestorable → KILLED
|
prgRam.checkRestorable(mmc1.prgRam()); |
|
252
|
1
1. checkRestorable : removed call to com/rox/cartridge/ChrMemory::checkRestorable → KILLED
|
chr.checkRestorable(mmc1.chrRam()); |
|
253
|
|
} |
|
254
|
|
|
|
255
|
|
@Override |
|
256
|
|
public void restore(final MapperSnapshot snapshot){ |
|
257
|
1
1. restore : removed call to com/rox/cartridge/Mmc1Mapper::checkRestorable → KILLED
|
checkRestorable(snapshot); |
|
258
|
|
final Mmc1MapperSnapshot mmc1 = (Mmc1MapperSnapshot) snapshot; |
|
259
|
1
1. restore : removed call to com/rox/mem/RAM::restore → KILLED
|
prgRam.restore(mmc1.prgRam()); |
|
260
|
1
1. restore : removed call to com/rox/cartridge/ChrMemory::restore → KILLED
|
chr.restore(mmc1.chrRam()); |
|
261
|
|
shiftRegister = mmc1.shiftRegister(); |
|
262
|
|
shiftCount = mmc1.shiftCount(); |
|
263
|
|
controlRegister = mmc1.controlRegister(); |
|
264
|
|
chrBank0Register = mmc1.chrBank0Register(); |
|
265
|
|
chrBank1Register = mmc1.chrBank1Register(); |
|
266
|
|
prgBankRegister = mmc1.prgBankRegister(); |
|
267
|
|
} |
|
268
|
|
} |
| | Mutations |
| 75 |
|
1.1 Location : <init> Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:rejectsZeroLengthPrgRom()] negated conditional → KILLED
|
| 84 |
|
1.1 Location : read Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] changed conditional boundary → KILLED
2.2 Location : read Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgRamReadsBackWhatWasWritten()] negated conditional → KILLED
|
| 85 |
|
1.1 Location : read Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced bitwise AND with OR → KILLED
2.2 Location : read Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::read → KILLED
|
| 87 |
|
1.1 Location : read Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgRamReadsBackWhatWasWritten()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::read → KILLED
|
| 93 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] changed conditional boundary → KILLED
2.2 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] negated conditional → KILLED
|
| 94 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgRamReadsBackWhatWasWritten()] removed call to com/rox/mem/RAM::write → KILLED
|
| 97 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] negated conditional → KILLED
2.2 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] Replaced bitwise AND with OR → KILLED
|
| 100 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:resetSetsPrgBankModeBitsEvenWhenTheyWerePreviouslyClear()] Replaced bitwise OR with AND → KILLED
|
| 103 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] Replaced Shift Left with Shift Right → KILLED
2.2 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] Replaced bitwise OR with AND → KILLED
3.3 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] Replaced bitwise AND with OR → KILLED
|
| 104 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] Replaced integer addition with subtraction → KILLED
|
| 105 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] negated conditional → KILLED
|
| 106 |
|
1.1 Location : write Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] removed call to com/rox/cartridge/Mmc1Mapper::latch → KILLED
|
| 113 |
|
1.1 Location : latch Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] negated conditional → KILLED
2.2 Location : latch Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToChrBank0RangeLatchChrBank0Register()] changed conditional boundary → KILLED
|
| 115 |
|
1.1 Location : latch Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToChrBank1RangeLatchChrBank1Register()] changed conditional boundary → KILLED
2.2 Location : latch Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToHighRangeLatchThePrgBankRegister()] negated conditional → KILLED
|
| 117 |
|
1.1 Location : latch Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToHighRangeLatchThePrgBankRegister()] negated conditional → KILLED
2.2 Location : latch Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToHighRangeLatchThePrgBankRegister()] changed conditional boundary → KILLED
|
| 136 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced integer subtraction with addition → KILLED
|
| 137 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced integer division with multiplication → KILLED
|
| 138 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] Replaced Shift Right with Shift Left → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced bitwise AND with OR → KILLED
|
| 139 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode1AlsoSelects32KbBank()] Replaced bitwise AND with OR → KILLED
|
| 141 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] negated conditional → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode1AlsoSelects32KbBank()] changed conditional boundary → KILLED
|
| 142 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced integer modulus with multiplication → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced Shift Right with Shift Left → KILLED
3.3 Location : prgRomOffset Killed by : none Replaced integer division with multiplication → SURVIVED
Covering tests
Covered by tests:
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode1AlsoSelects32KbBank()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0DoesNotCrashOnASingleBankRomAndMirrorsIt()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0Selects32KbBankIgnoringLowBitOfBankNumber()]
|
| 145 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced integer addition with subtraction → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced integer modulus with multiplication → KILLED
3.3 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] Replaced integer multiplication with division → KILLED
4.4 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode0PicksTheCorrect32KbBankForABankNumberAboveHalfTheTotal()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgRomOffset → KILLED
|
| 147 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] negated conditional → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] changed conditional boundary → KILLED
|
| 148 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] negated conditional → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode3SwitchesFirstWindowAndFixesLastBankAtSecondWindow()] Replaced integer modulus with multiplication → KILLED
|
| 149 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode3PreservesNonZeroOffsetWithinTheSwitchableWindow()] Replaced integer addition with subtraction → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode3SwitchesFirstWindowAndFixesLastBankAtSecondWindow()] Replaced integer multiplication with division → KILLED
3.3 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode3SwitchesFirstWindowAndFixesLastBankAtSecondWindow()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgRomOffset → KILLED
|
| 151 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode3SwitchesFirstWindowAndFixesLastBankAtSecondWindow()] Replaced integer subtraction with addition → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] negated conditional → KILLED
3.3 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] Replaced integer modulus with multiplication → KILLED
|
| 152 |
|
1.1 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode3PreservesNonZeroOffsetWithinTheFixedWindow()] Replaced integer addition with subtraction → KILLED
2.2 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgRomOffset → KILLED
3.3 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] Replaced integer multiplication with division → KILLED
4.4 Location : prgRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgBankMode2FixesFirstBankAndSwitchesSecondWindow()] Replaced integer subtraction with addition → KILLED
|
| 157 |
|
1.1 Location : readChr Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:noChrBanksMeansWritableChrRamIgnoringBankRegisters()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::readChr → KILLED
|
| 165 |
|
1.1 Location : writeChr Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:noChrBanksMeansWritableChrRamIgnoringBankRegisters()] removed call to com/rox/cartridge/ChrMemory::write → KILLED
|
| 170 |
|
1.1 Location : chrOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:eachChrRamAddressHoldsItsOwnByteWhateverTheBankRegistersSay()] negated conditional → KILLED
2.2 Location : chrOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:eachChrRamAddressHoldsItsOwnByteWhateverTheBankRegistersSay()] Replaced bitwise AND with OR → KILLED
3.3 Location : chrOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:eachChrRamAddressHoldsItsOwnByteWhateverTheBankRegistersSay()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrOffset → KILLED
|
| 185 |
|
1.1 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()] negated conditional → KILLED
2.2 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()] Replaced bitwise AND with OR → KILLED
|
| 186 |
|
1.1 Location : chrRomOffset Killed by : none Replaced integer division with multiplication → SURVIVED
Covering tests
Covered by tests:
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSwitchesTheWholeWindowIgnoringTheBankRegistersLowBit()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:writesToChrRomAreNoOps()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeWrapsTheBankNumberModuloTheTotalBankCount()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSwitchesEachHalfIndependently()]
|
| 187 |
|
1.1 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()] negated conditional → KILLED
|
| 188 |
|
1.1 Location : chrRomOffset Killed by : none Replaced integer division with multiplication → SURVIVED
Covering tests
Covered by tests:
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSwitchesTheWholeWindowIgnoringTheBankRegistersLowBit()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()]
- com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:writesToChrRomAreNoOps()]
2.2 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()] Replaced Shift Right with Shift Left → KILLED
3.3 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()] Replaced integer modulus with multiplication → KILLED
|
| 189 |
|
1.1 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSelectsTheCorrectEightKbBankAmongSeveral()] Replaced integer multiplication with division → KILLED
2.2 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSwitchesTheWholeWindowIgnoringTheBankRegistersLowBit()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrRomOffset → KILLED
3.3 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSwitchesTheWholeWindowIgnoringTheBankRegistersLowBit()] Replaced integer modulus with multiplication → KILLED
4.4 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrEightKbModeSwitchesTheWholeWindowIgnoringTheBankRegistersLowBit()] Replaced integer addition with subtraction → KILLED
|
| 191 |
|
1.1 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] negated conditional → KILLED
2.2 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] changed conditional boundary → KILLED
|
| 192 |
|
1.1 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] Replaced integer modulus with multiplication → KILLED
2.2 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] Replaced bitwise AND with OR → KILLED
|
| 193 |
|
1.1 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] Replaced bitwise AND with OR → KILLED
2.2 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrRomOffset → KILLED
3.3 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] Replaced integer modulus with multiplication → KILLED
4.4 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSwitchesEachHalfIndependently()] Replaced integer addition with subtraction → KILLED
5.5 Location : chrRomOffset Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:chrFourKbModeSelectsIndependentBanksForEachHalf()] Replaced integer multiplication with division → KILLED
|
| 198 |
|
1.1 Location : nametableMirroring Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:mirroringControlBitsZeroAndOneMeanFixedSingleScreens()] Replaced bitwise AND with OR → KILLED
2.2 Location : nametableMirroring Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:mirroringControlBitsZeroAndOneMeanFixedSingleScreens()] replaced return value with null for com/rox/cartridge/Mmc1Mapper::nametableMirroring → KILLED
|
| 207 |
|
1.1 Location : controlRegister Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fifthWriteIsTheHighestBitOfTheLatchedValue()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::controlRegister → KILLED
|
| 211 |
|
1.1 Location : chrBank0Register Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToChrBank0RangeLatchChrBank0Register()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrBank0Register → KILLED
|
| 215 |
|
1.1 Location : chrBank1Register Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToChrBank1RangeLatchChrBank1Register()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::chrBank1Register → KILLED
|
| 219 |
|
1.1 Location : prgBankRegister Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:fiveWritesToHighRangeLatchThePrgBankRegister()] replaced int return with 0 for com/rox/cartridge/Mmc1Mapper::prgBankRegister → KILLED
|
| 229 |
|
1.1 Location : debugState Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:debugStateReportsAllFourBankRegisters()] replaced return value with Collections.emptyMap for com/rox/cartridge/Mmc1Mapper::debugState → KILLED
|
| 234 |
|
1.1 Location : prgRam Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:prgRamRoundTripsThroughRestore()] replaced return value with null for com/rox/cartridge/Mmc1Mapper::prgRam → KILLED
|
| 239 |
|
1.1 Location : restorePrgRam Killed by : com.rox.cartridge.Mmc1MapperTest.[engine:junit-jupiter]/[class:com.rox.cartridge.Mmc1MapperTest]/[method:restorePrgRamRejectsTheWrongLength()] removed call to com/rox/mem/RAM::restore → KILLED
|
| 244 |
|
1.1 Location : snapshot Killed by : com.rox.cartridge.MapperSnapshotTest.[engine:junit-jupiter]/[class:com.rox.cartridge.MapperSnapshotTest]/[test-template:checkRestorableRejectsWhicheverArrayIsWrong(java.lang.String, java.lang.String)]/[test-template-invocation:#3] replaced return value with null for com/rox/cartridge/Mmc1Mapper::snapshot → KILLED
|
| 251 |
|
1.1 Location : checkRestorable Killed by : com.rox.cartridge.MapperSnapshotTest.[engine:junit-jupiter]/[class:com.rox.cartridge.MapperSnapshotTest]/[test-template:checkRestorableRejectsWhicheverArrayIsWrong(java.lang.String, java.lang.String)]/[test-template-invocation:#3] removed call to com/rox/mem/RAM::checkRestorable → KILLED
|
| 252 |
|
1.1 Location : checkRestorable Killed by : com.rox.cartridge.MapperSnapshotTest.[engine:junit-jupiter]/[class:com.rox.cartridge.MapperSnapshotTest]/[test-template:checkRestorableRejectsWhicheverArrayIsWrong(java.lang.String, java.lang.String)]/[test-template-invocation:#4] removed call to com/rox/cartridge/ChrMemory::checkRestorable → KILLED
|
| 257 |
|
1.1 Location : restore Killed by : com.rox.cartridge.MapperSnapshotTest.[engine:junit-jupiter]/[class:com.rox.cartridge.MapperSnapshotTest]/[method:restoreRejectsAnotherBoardsSnapshot()] removed call to com/rox/cartridge/Mmc1Mapper::checkRestorable → KILLED
|
| 259 |
|
1.1 Location : restore Killed by : com.rox.cartridge.MapperSnapshotTest.[engine:junit-jupiter]/[class:com.rox.cartridge.MapperSnapshotTest]/[method:mmc1RoundTripsEveryRegisterIncludingAPartFilledShiftRegister()] removed call to com/rox/mem/RAM::restore → KILLED
|
| 260 |
|
1.1 Location : restore Killed by : com.rox.cartridge.MapperSnapshotTest.[engine:junit-jupiter]/[class:com.rox.cartridge.MapperSnapshotTest]/[method:mmc1RoundTripsEveryRegisterIncludingAPartFilledShiftRegister()] removed call to com/rox/cartridge/ChrMemory::restore → KILLED
|