Skip to content

Commit b3d1241

Browse files
committed
Support 3 gameshark modes.
1 parent 662c252 commit b3d1241

File tree

5 files changed

+23
-9
lines changed

5 files changed

+23
-9
lines changed

core/src/main/java/eu/rekawek/coffeegb/core/genie/GameGeniePatch.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public int getAddress() {
99
}
1010

1111
@Override
12-
public boolean accepts(AddressSpace addressSpace, boolean gbc) {
12+
public boolean accepts(AddressSpace addressSpace, int ramBank, boolean gbc) {
1313
if (oldData == -1) {
1414
return true;
1515
}

core/src/main/java/eu/rekawek/coffeegb/core/genie/GameSharkPatch.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,24 @@
33
import eu.rekawek.coffeegb.core.AddressSpace;
44
import eu.rekawek.coffeegb.core.memory.GbcRam;
55

6-
public record GameSharkPatch(int bank, int address, int data) implements Patch {
6+
public record GameSharkPatch(int mode, int bank, int address, int data) implements Patch {
77
@Override
88
public int getAddress() {
99
return address;
1010
}
1111

1212
@Override
13-
public boolean accepts(AddressSpace addressSpace, boolean gbc) {
14-
var currentBank = gbc ? Math.max(addressSpace.getByte(GbcRam.SVBK) & 0x07, 1) : 1;
15-
return currentBank == bank;
13+
public boolean accepts(AddressSpace addressSpace, int ramBank, boolean gbc) {
14+
if (mode == 0 && bank == 1) {
15+
return true;
16+
}
17+
if (mode == 8 && bank == ramBank) {
18+
return true;
19+
}
20+
if (mode == 9) {
21+
return Math.max(1, bank) == (gbc ? Math.max(addressSpace.getByte(GbcRam.SVBK) & 0x07, 1) : 1);
22+
}
23+
return false;
1624
}
1725

1826
@Override

core/src/main/java/eu/rekawek/coffeegb/core/genie/Genie.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class Genie implements AddressSpace, Originator<Genie> {
1818

1919
private final boolean gbc;
2020

21+
private int ramBank;
22+
2123
public Genie(AddressSpace delegate, boolean gbc) {
2224
this.delegate = delegate;
2325
this.gbc = gbc;
@@ -38,6 +40,9 @@ public boolean accepts(int address) {
3840

3941
@Override
4042
public void setByte(int address, int value) {
43+
if (address >= 0x4000 && address <= 0x5fff) {
44+
ramBank = value & 0xf;
45+
}
4146
delegate.setByte(address, value);
4247
}
4348

@@ -46,7 +51,7 @@ public int getByte(int address) {
4651
var value = delegate.getByte(address);
4752
if (patches.containsKey(address)) {
4853
for (Patch p : patches.get(address)) {
49-
if (p.accepts(delegate, gbc)) {
54+
if (p.accepts(delegate, ramBank, gbc)) {
5055
return p.getValue();
5156
}
5257
}

core/src/main/java/eu/rekawek/coffeegb/core/genie/Patch.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public interface Patch extends Serializable {
88

99
int getAddress();
1010

11-
boolean accepts(AddressSpace addressSpace, boolean gbc);
11+
boolean accepts(AddressSpace addressSpace, int ramBank, boolean gbc);
1212

1313
int getValue();
1414
}

core/src/main/java/eu/rekawek/coffeegb/core/genie/PatchFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ private static GameGeniePatch parseGameGenieShortCode(String code) {
5454

5555
private static GameSharkPatch parseGameSharkCode(String code) {
5656
var c = code.toLowerCase().toCharArray();
57-
var bank = parse(c, 0, 1);
57+
var mode = parse(c, 0);
58+
var bank = parse(c, 1);
5859
var newData = parse(c, 2, 3);
5960
var address = parse(c, 6, 7, 4, 5);
60-
return new GameSharkPatch(bank, address, newData);
61+
return new GameSharkPatch(mode, bank, address, newData);
6162
}
6263

6364
private static int parse(char[] code, int... offsets) {

0 commit comments

Comments
 (0)