forked from BluestormDNA/ProjectDMG
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MBC2.cs
60 lines (50 loc) · 1.67 KB
/
MBC2.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using ProjectDMG.DMG.State.DataStructures.GamePak;
using System;
namespace ProjectDMG.DMG.GamePak {
class MBC2 : IGamePak {
private byte[] ROM;
private byte[] ERAM = new byte [0x200]; //MBC2 512x4b internal ram
private bool ERAM_ENABLED;
private int ROM_BANK;
private const int ROM_OFFSET = 0x4000;
public void Init(byte[] ROM) {
this.ROM = ROM;
}
public byte ReadERAM(ushort addr) {
if (ERAM_ENABLED){
return ERAM[addr & 0x1FFF];
} else {
return 0xFF;
}
}
public byte ReadLoROM(ushort addr) {
return ROM[addr];
}
public byte ReadHiROM(ushort addr) {
return ROM[(ROM_OFFSET * ROM_BANK) + (addr & 0x3FFF)];
}
public void WriteERAM(ushort addr, byte value) {
if (ERAM_ENABLED) {
ERAM[addr & 0x1FFF] = value;
}
}
public void WriteROM(ushort addr, byte value) {
switch (addr) {
case ushort r when addr >= 0x0000 && addr <= 0x1FFF:
ERAM_ENABLED = ((value & 0x1) == 0x0) ? true : false;
break;
case ushort r when addr >= 0x2000 && addr <= 0x3FFF:
ROM_BANK = value & 0xF; //only last 4bits are used
break;
}
}
public GamePakSavedState GetSavedState()
{
throw new NotImplementedException();
}
public void Init(byte[] ROM, GamePakSavedState savedState)
{
throw new NotImplementedException();
}
}
}