Change MBC simulator to simulate async RAM/ROM
diff --git a/verilog/sim/mbcsim.cpp b/verilog/sim/mbcsim.cpp
index 69a836f..f8033ff 100644
--- a/verilog/sim/mbcsim.cpp
+++ b/verilog/sim/mbcsim.cpp
@@ -35,9 +35,6 @@
mbc_mode = 0; // Banking mode for MBC1
rom_bank = 1;
ram_bank = 0;
- last_wr = 0;
- last_rd = 0;
- last_data = 0;
}
MBCSIM::~MBCSIM(void) {
@@ -123,48 +120,48 @@
}
void MBCSIM::apply(const uint8_t wr_data, const uint16_t address,
- const uint8_t wr_enable, const uint8_t rd_enable, uint8_t &rd_data) {
+ const uint8_t wr, const uint8_t rd, uint8_t &rd_data) {
// Address within ROM window or RAM window
if ((address <= 0x8000) || ((address >= 0xa000) && (address < 0xc000))) {
- if (last_wr && !wr_enable) {
+ if (wr) {
if (address >= 0xa000) {
// Write to RAM
if (ram_enable == 0x0a) {
if ((mbc_type == MBC1) && (mbc_mode == 0)) {
- ram[address - 0xa000] = last_data;
+ ram[address - 0xa000] = wr_data;
}
else {
- ram[address - 0xa000 + ram_bank * 0x2000] = last_data;
+ ram[address - 0xa000 + ram_bank * 0x2000] = wr_data;
}
}
}
else if (address < 0x2000) {
// RAM Enable (MBC1/3/5)
- ram_enable = last_data;
+ ram_enable = wr_data;
}
else if (address < 0x4000) {
// ROM Bank (MBC1/3/5)
if (mbc_type == MBC1) {
rom_bank &= ~0x1f;
- rom_bank = (unsigned int)last_data & 0x1f;
- if (last_data == 0)
+ rom_bank = (unsigned int)wr_data & 0x1f;
+ if (wr_data == 0)
rom_bank |= 0x01;
}
else if (mbc_type == MBC3) {
rom_bank &= ~0x7f;
- rom_bank = (unsigned int)last_data & 0x7f;
- if (last_data == 0)
+ rom_bank = (unsigned int)wr_data & 0x7f;
+ if (wr_data == 0)
rom_bank |= 0x01;
}
else if (mbc_type == MBC5) {
if (address < 0x3000) {
rom_bank &= ~0xff;
- rom_bank |= (unsigned int)last_data & 0xff;
+ rom_bank |= (unsigned int)wr_data & 0xff;
}
else {
rom_bank &= ~0x100;
- rom_bank |= ((unsigned int)last_data & 0x01) << 8;
+ rom_bank |= ((unsigned int)wr_data & 0x01) << 8;
}
}
//printf("[MBC] Rom bank %d (%04x=%02x)\n", rom_bank, address, last_data);
@@ -173,20 +170,20 @@
if ((mbc_type == MBC1) && (mbc_mode == 0)) {
// High ROM Bank
rom_bank &= ~0xe0;
- rom_bank |= ((unsigned int)last_data & 0x03) << 5;
+ rom_bank |= ((unsigned int)wr_data & 0x03) << 5;
//printf("[MBC] Rom bank %d (%04x=%02x)\n", rom_bank, address, last_data);
}
else {
// RAM Bank
- ram_bank = last_data;
+ ram_bank = wr_data;
//printf("[MBC] Ram bank %d (%04x=%02x)\n", ram_bank, address, last_data);
}
}
else if (address < 0x8000) {
- mbc_mode = last_data;
+ mbc_mode = wr_data;
}
}
- else if (!last_rd && rd_enable) {
+ else if (rd) {
if (address < 0x4000) {
// LoROM
rd_data = rom[address];
@@ -206,9 +203,6 @@
}
}
}
- last_rd = rd_enable;
- last_wr = wr_enable;
- last_data = wr_data;
}
diff --git a/verilog/sim/mbcsim.h b/verilog/sim/mbcsim.h
index 87c4f36..e958b57 100644
--- a/verilog/sim/mbcsim.h
+++ b/verilog/sim/mbcsim.h
@@ -32,8 +32,8 @@
MBCSIM(void);
~MBCSIM(void);
void load(const char *fname);
- void apply(const uint8_t wr_data, const uint16_t address, const uint8_t wr_enable,
- const uint8_t rd_enable, uint8_t &rd_data);
+ void apply(const uint8_t wr_data, const uint16_t address, const uint8_t wr,
+ const uint8_t rd, uint8_t &rd_data);
private:
typedef enum {
MBCNONE,
@@ -46,9 +46,6 @@
uint8_t *rom;
uint8_t *ram;
- uint8_t last_wr;
- uint8_t last_rd;
- uint8_t last_data;
MBCTYPE mbc_type;
char ram_enable;
char mbc_mode;