Mmc1Mapper.java

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

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

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

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

Active mutators

Tests examined


Report generated by PIT 1.22.1