mirror of https://github.com/bsnes-emu/bsnes.git
Update to v084r06 release.
byuu says: Changelog: - fixed sprite tile masking for 8x16 mode (fixes Zelda: DX sprites) - HuC1 flag sets RAM writable, not RAM enable (fixes Pokemon Card) - removed within<> template, didn't turn out to be all that useful I would be almost certain no games would break by allowing reads when it is disabled, no game would rely on that behavior. I prefer to be overly restrictive. Better to not allow valid behavior than to allow invalid behavior. The latter is what gives us a dozen broken SNES translations.
This commit is contained in:
parent
6227974bf6
commit
0bd21185b8
|
@ -1,53 +1,54 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::HuC1::mmio_read(uint16 addr) {
|
uint8 Cartridge::HuC1::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
||||||
return 0x00;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::HuC1::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::HuC1::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
ram_enable = (data & 0x0f) == 0x0a;
|
ram_writable = (data & 0x0f) == 0x0a;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x3fff>(addr)) {
|
if((addr & 0xe000) == 0x2000) { //$2000-3fff
|
||||||
rom_select = data;
|
rom_select = data;
|
||||||
|
if(rom_select == 0) rom_select = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x5fff>(addr)) {
|
if((addr & 0xe000) == 0x4000) { //$4000-5fff
|
||||||
ram_select = data;
|
ram_select = data;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x6000, 0x7fff>(addr)) {
|
if((addr & 0xe000) == 0x6000) { //$6000-7fff
|
||||||
//unknown purpose
|
model = data & 0x01;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
if(ram_writable == false) return;
|
||||||
return;
|
return cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::HuC1::power() {
|
void Cartridge::HuC1::power() {
|
||||||
ram_enable = false;
|
ram_writable = false;
|
||||||
rom_select = 0x01;
|
rom_select = 0x01;
|
||||||
ram_select = 0x00;
|
ram_select = 0x00;
|
||||||
|
model = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
struct HuC1 : MMIO {
|
struct HuC1 : MMIO {
|
||||||
bool ram_enable; //0000-1fff
|
bool ram_writable; //$0000-1fff
|
||||||
uint8 rom_select; //2000-3fff
|
uint8 rom_select; //$2000-3fff
|
||||||
uint8 ram_select; //4000-5fff
|
uint8 ram_select; //$4000-5fff
|
||||||
|
bool model; //$6000-7fff
|
||||||
|
|
||||||
uint8 mmio_read(uint16 addr);
|
uint8 mmio_read(uint16 addr);
|
||||||
void mmio_write(uint16 addr, uint8 data);
|
void mmio_write(uint16 addr, uint8 data);
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::HuC3::mmio_read(uint16 addr) {
|
uint8 Cartridge::HuC3::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
if(ram_enable) return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
@ -18,27 +18,27 @@ uint8 Cartridge::HuC3::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::HuC3::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::HuC3::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
ram_enable = (data & 0x0f) == 0x0a;
|
ram_enable = (data & 0x0f) == 0x0a;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x3fff>(addr)) {
|
if((addr & 0xe000) == 0x2000) { //$2000-3fff
|
||||||
rom_select = data;
|
rom_select = data;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x5fff>(addr)) {
|
if((addr & 0xe000) == 0x4000) { //$4000-5fff
|
||||||
ram_select = data;
|
ram_select = data;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x6000, 0x7fff>(addr)) {
|
if((addr & 0xe000) == 0x6000) { //$6000-7fff
|
||||||
//unknown purpose
|
//unknown purpose
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
if(ram_enable) cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
struct HuC3 : MMIO {
|
struct HuC3 : MMIO {
|
||||||
bool ram_enable; //0000-1fff
|
bool ram_enable; //$0000-1fff
|
||||||
uint8 rom_select; //2000-3fff
|
uint8 rom_select; //$2000-3fff
|
||||||
uint8 ram_select; //4000-5fff
|
uint8 ram_select; //$4000-5fff
|
||||||
|
|
||||||
uint8 mmio_read(uint16 addr);
|
uint8 mmio_read(uint16 addr);
|
||||||
void mmio_write(uint16 addr, uint8 data);
|
void mmio_write(uint16 addr, uint8 data);
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::MBC0::mmio_read(uint16 addr) {
|
uint8 Cartridge::MBC0::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x7fff>(addr)) {
|
if((addr & 0x8000) == 0x0000) { //$0000-7fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
return cartridge.ram_read(addr & 0x1fff);
|
return cartridge.ram_read(addr & 0x1fff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ uint8 Cartridge::MBC0::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::MBC0::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::MBC0::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
cartridge.ram_write(addr & 0x1fff, data);
|
cartridge.ram_write(addr & 0x1fff, data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::MBC1::mmio_read(uint16 addr) {
|
uint8 Cartridge::MBC1::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
if(mode_select == 0) {
|
if(mode_select == 0) {
|
||||||
return cartridge.rom_read((ram_select << 19) | (rom_select << 14) | (addr & 0x3fff));
|
return cartridge.rom_read((ram_select << 19) | (rom_select << 14) | (addr & 0x3fff));
|
||||||
} else {
|
} else {
|
||||||
|
@ -13,7 +13,7 @@ uint8 Cartridge::MBC1::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) {
|
if(ram_enable) {
|
||||||
if(mode_select == 0) {
|
if(mode_select == 0) {
|
||||||
return cartridge.ram_read(addr & 0x1fff);
|
return cartridge.ram_read(addr & 0x1fff);
|
||||||
|
@ -28,27 +28,27 @@ uint8 Cartridge::MBC1::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::MBC1::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::MBC1::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
ram_enable = (data & 0x0f) == 0x0a;
|
ram_enable = (data & 0x0f) == 0x0a;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x3fff>(addr)) {
|
if((addr & 0xe000) == 0x2000) { //$2000-3fff
|
||||||
rom_select = (data & 0x1f) + ((data & 0x1f) == 0);
|
rom_select = (data & 0x1f) + ((data & 0x1f) == 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x5fff>(addr)) {
|
if((addr & 0xe000) == 0x4000) { //$4000-5fff
|
||||||
ram_select = data & 0x03;
|
ram_select = data & 0x03;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x6000, 0x7fff>(addr)) {
|
if((addr & 0xe000) == 0x6000) { //$6000-7fff
|
||||||
mode_select = data & 0x01;
|
mode_select = data & 0x01;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) {
|
if(ram_enable) {
|
||||||
if(mode_select == 0) {
|
if(mode_select == 0) {
|
||||||
cartridge.ram_write(addr & 0x1fff, data);
|
cartridge.ram_write(addr & 0x1fff, data);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
struct MBC1 : MMIO {
|
struct MBC1 : MMIO {
|
||||||
bool ram_enable; //0000-1fff
|
bool ram_enable; //$0000-1fff
|
||||||
uint8 rom_select; //2000-3fff
|
uint8 rom_select; //$2000-3fff
|
||||||
uint8 ram_select; //4000-5fff
|
uint8 ram_select; //$4000-5fff
|
||||||
bool mode_select; //6000-7fff
|
bool mode_select; //$6000-7fff
|
||||||
|
|
||||||
uint8 mmio_read(uint16 addr);
|
uint8 mmio_read(uint16 addr);
|
||||||
void mmio_write(uint16 addr, uint8 data);
|
void mmio_write(uint16 addr, uint8 data);
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::MBC2::mmio_read(uint16 addr) {
|
uint8 Cartridge::MBC2::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xa1ff>(addr)) {
|
if((addr & 0xee00) == 0xa000) { //$a000-a1ff
|
||||||
if(ram_enable) return cartridge.ram_read(addr & 0x1ff);
|
if(ram_enable) return cartridge.ram_read(addr & 0x1ff);
|
||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
@ -18,17 +18,17 @@ uint8 Cartridge::MBC2::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::MBC2::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::MBC2::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
if(!(addr & 0x0100)) ram_enable = (data & 0x0f) == 0x0a;
|
if(!(addr & 0x0100)) ram_enable = (data & 0x0f) == 0x0a;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x3fff>(addr)) {
|
if((addr & 0xe000) == 0x2000) { //$2000-3fff
|
||||||
if( (addr & 0x0100)) rom_select = (data & 0x0f) + ((data & 0x0f) == 0);
|
if( (addr & 0x0100)) rom_select = (data & 0x0f) + ((data & 0x0f) == 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xa1ff>(addr)) {
|
if((addr & 0xee00) == 0xa000) { //$a000-a1ff
|
||||||
if(ram_enable) cartridge.ram_write(addr & 0x1ff, data & 0x0f);
|
if(ram_enable) cartridge.ram_write(addr & 0x1ff, data & 0x0f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
struct MBC2 : MMIO {
|
struct MBC2 : MMIO {
|
||||||
bool ram_enable; //0000-1fff
|
bool ram_enable; //$0000-1fff
|
||||||
uint8 rom_select; //2000-3fff
|
uint8 rom_select; //$2000-3fff
|
||||||
|
|
||||||
uint8 mmio_read(uint16 addr);
|
uint8 mmio_read(uint16 addr);
|
||||||
void mmio_write(uint16 addr, uint8 data);
|
void mmio_write(uint16 addr, uint8 data);
|
||||||
|
|
|
@ -19,15 +19,15 @@ void Cartridge::MBC3::second() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 Cartridge::MBC3::mmio_read(uint16 addr) {
|
uint8 Cartridge::MBC3::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) {
|
if(ram_enable) {
|
||||||
if(ram_select >= 0x00 && ram_select <= 0x03) {
|
if(ram_select >= 0x00 && ram_select <= 0x03) {
|
||||||
return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
||||||
|
@ -45,22 +45,22 @@ uint8 Cartridge::MBC3::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::MBC3::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::MBC3::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
ram_enable = (data & 0x0f) == 0x0a;
|
ram_enable = (data & 0x0f) == 0x0a;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x3fff>(addr)) {
|
if((addr & 0xe000) == 0x2000) { //$2000-3fff
|
||||||
rom_select = (data & 0x7f) + ((data & 0x7f) == 0);
|
rom_select = (data & 0x7f) + ((data & 0x7f) == 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x5fff>(addr)) {
|
if((addr & 0xe000) == 0x4000) { //$4000-5fff
|
||||||
ram_select = data;
|
ram_select = data;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x6000, 0x7fff>(addr)) {
|
if((addr & 0xe000) == 0x6000) { //$6000-7fff
|
||||||
if(rtc_latch == 0 && data == 1) {
|
if(rtc_latch == 0 && data == 1) {
|
||||||
rtc_latch_second = rtc_second;
|
rtc_latch_second = rtc_second;
|
||||||
rtc_latch_minute = rtc_minute;
|
rtc_latch_minute = rtc_minute;
|
||||||
|
@ -72,7 +72,7 @@ void Cartridge::MBC3::mmio_write(uint16 addr, uint8 data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) {
|
if(ram_enable) {
|
||||||
if(ram_select >= 0x00 && ram_select <= 0x03) {
|
if(ram_select >= 0x00 && ram_select <= 0x03) {
|
||||||
cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
struct MBC3 : MMIO {
|
struct MBC3 : MMIO {
|
||||||
bool ram_enable; //0000-1fff
|
bool ram_enable; //$0000-1fff
|
||||||
uint8 rom_select; //2000-3fff
|
uint8 rom_select; //$2000-3fff
|
||||||
uint8 ram_select; //4000-5fff
|
uint8 ram_select; //$4000-5fff
|
||||||
bool rtc_latch; //6000-7fff
|
bool rtc_latch; //$6000-7fff
|
||||||
|
|
||||||
bool rtc_halt;
|
bool rtc_halt;
|
||||||
unsigned rtc_second;
|
unsigned rtc_second;
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::MBC5::mmio_read(uint16 addr) {
|
uint8 Cartridge::MBC5::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(addr);
|
return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
if(ram_enable) return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));
|
||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
@ -18,27 +18,27 @@ uint8 Cartridge::MBC5::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::MBC5::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::MBC5::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
ram_enable = (data & 0x0f) == 0x0a;
|
ram_enable = (data & 0x0f) == 0x0a;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x2fff>(addr)) {
|
if((addr & 0xf000) == 0x2000) { //$2000-2fff
|
||||||
rom_select = (rom_select & 0x0100) | data;
|
rom_select = (rom_select & 0x0100) | data;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x3000, 0x3fff>(addr)) {
|
if((addr & 0xf000) == 0x3000) { //$3000-3fff
|
||||||
rom_select = ((data & 1) << 8) | (rom_select & 0x00ff);
|
rom_select = ((data & 1) << 8) | (rom_select & 0x00ff);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x5fff>(addr)) {
|
if((addr & 0xe000) == 0x4000) { //$4000-5fff
|
||||||
ram_select = data & 0x0f;
|
ram_select = data & 0x0f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
if(ram_enable) cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
struct MBC5 : MMIO {
|
struct MBC5 : MMIO {
|
||||||
bool ram_enable; //0000-1fff
|
bool ram_enable; //$0000-1fff
|
||||||
uint16 rom_select; //2000-2fff + 3000-3fff
|
uint16 rom_select; //$2000-2fff + $3000-3fff
|
||||||
uint8 ram_select; //4000-5fff
|
uint8 ram_select; //$4000-5fff
|
||||||
|
|
||||||
uint8 mmio_read(uint16 addr);
|
uint8 mmio_read(uint16 addr);
|
||||||
void mmio_write(uint16 addr, uint8 data);
|
void mmio_write(uint16 addr, uint8 data);
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
#ifdef CARTRIDGE_CPP
|
#ifdef CARTRIDGE_CPP
|
||||||
|
|
||||||
uint8 Cartridge::MMM01::mmio_read(uint16 addr) {
|
uint8 Cartridge::MMM01::mmio_read(uint16 addr) {
|
||||||
if(within<0x0000, 0x7fff>(addr)) {
|
if((addr & 0x8000) == 0x0000) { //$0000-7fff
|
||||||
if(rom_mode == 0) return cartridge.rom_read(addr);
|
if(rom_mode == 0) return cartridge.rom_read(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x0000, 0x3fff>(addr)) {
|
if((addr & 0xc000) == 0x0000) { //$0000-3fff
|
||||||
return cartridge.rom_read(0x8000 + (rom_base << 14) + (addr & 0x3fff));
|
return cartridge.rom_read(0x8000 + (rom_base << 14) + (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x7fff>(addr)) {
|
if((addr & 0xc000) == 0x4000) { //$4000-7fff
|
||||||
return cartridge.rom_read(0x8000 + (rom_base << 14) + (rom_select << 14) + (addr & 0x3fff));
|
return cartridge.rom_read(0x8000 + (rom_base << 14) + (rom_select << 14) + (addr & 0x3fff));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) return cartridge.ram_read((ram_select << 13) + (addr & 0x1fff));
|
if(ram_enable) return cartridge.ram_read((ram_select << 13) + (addr & 0x1fff));
|
||||||
return 0x00;
|
return 0x00;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ uint8 Cartridge::MMM01::mmio_read(uint16 addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cartridge::MMM01::mmio_write(uint16 addr, uint8 data) {
|
void Cartridge::MMM01::mmio_write(uint16 addr, uint8 data) {
|
||||||
if(within<0x0000, 0x1fff>(addr)) {
|
if((addr & 0xe000) == 0x0000) { //$0000-1fff
|
||||||
if(rom_mode == 0) {
|
if(rom_mode == 0) {
|
||||||
rom_mode = 1;
|
rom_mode = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -30,7 +30,7 @@ void Cartridge::MMM01::mmio_write(uint16 addr, uint8 data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x2000, 0x3fff>(addr)) {
|
if((addr & 0xe000) == 0x2000) { //$2000-3fff
|
||||||
if(rom_mode == 0) {
|
if(rom_mode == 0) {
|
||||||
rom_base = data & 0x3f;
|
rom_base = data & 0x3f;
|
||||||
} else {
|
} else {
|
||||||
|
@ -38,17 +38,17 @@ void Cartridge::MMM01::mmio_write(uint16 addr, uint8 data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x4000, 0x5fff>(addr)) {
|
if((addr & 0xe000) == 0x4000) { //$4000-5fff
|
||||||
if(rom_mode == 1) {
|
if(rom_mode == 1) {
|
||||||
ram_select = data;
|
ram_select = data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0x6000, 0x7fff>(addr)) {
|
if((addr & 0xe000) == 0x6000) { //$6000-7fff
|
||||||
//unknown purpose
|
//unknown purpose
|
||||||
}
|
}
|
||||||
|
|
||||||
if(within<0xa000, 0xbfff>(addr)) {
|
if((addr & 0xe000) == 0xa000) { //$a000-bfff
|
||||||
if(ram_enable) cartridge.ram_write((ram_select << 13) + (addr & 0x1fff), data);
|
if(ram_enable) cartridge.ram_write((ram_select << 13) + (addr & 0x1fff), data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,9 +41,10 @@ void Cartridge::serialize(serializer &s) {
|
||||||
s.integer(mmm01.rom_select);
|
s.integer(mmm01.rom_select);
|
||||||
s.integer(mmm01.ram_select);
|
s.integer(mmm01.ram_select);
|
||||||
|
|
||||||
s.integer(huc1.ram_enable);
|
s.integer(huc1.ram_writable);
|
||||||
s.integer(huc1.rom_select);
|
s.integer(huc1.rom_select);
|
||||||
s.integer(huc1.ram_select);
|
s.integer(huc1.ram_select);
|
||||||
|
s.integer(huc1.model);
|
||||||
|
|
||||||
s.integer(huc3.ram_enable);
|
s.integer(huc3.ram_enable);
|
||||||
s.integer(huc3.rom_select);
|
s.integer(huc3.rom_select);
|
||||||
|
|
|
@ -69,12 +69,6 @@ namespace GameBoy {
|
||||||
typedef uint_t<30> uint30;
|
typedef uint_t<30> uint30;
|
||||||
typedef uint_t<31> uint31;
|
typedef uint_t<31> uint31;
|
||||||
|
|
||||||
template<uint16 lo, uint16 hi>
|
|
||||||
alwaysinline bool within(uint16 addr) {
|
|
||||||
static const uint16 mask = ~(hi ^ lo);
|
|
||||||
return (addr & mask) == lo;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Processor {
|
struct Processor {
|
||||||
cothread_t thread;
|
cothread_t thread;
|
||||||
unsigned frequency;
|
unsigned frequency;
|
||||||
|
|
|
@ -140,7 +140,7 @@ void LCD::cgb_render_ob() {
|
||||||
unsigned n = sprite[s] << 2;
|
unsigned n = sprite[s] << 2;
|
||||||
unsigned sy = oam[n + 0] - 16;
|
unsigned sy = oam[n + 0] - 16;
|
||||||
unsigned sx = oam[n + 1] - 8;
|
unsigned sx = oam[n + 1] - 8;
|
||||||
unsigned tile = oam[n + 2];
|
unsigned tile = oam[n + 2] & ~status.ob_size;
|
||||||
unsigned attr = oam[n + 3];
|
unsigned attr = oam[n + 3];
|
||||||
|
|
||||||
sy = status.ly - sy;
|
sy = status.ly - sy;
|
||||||
|
|
|
@ -109,7 +109,7 @@ void LCD::dmg_render_ob() {
|
||||||
unsigned n = sprite[s] << 2;
|
unsigned n = sprite[s] << 2;
|
||||||
unsigned sy = oam[n + 0] - 16;
|
unsigned sy = oam[n + 0] - 16;
|
||||||
unsigned sx = oam[n + 1] - 8;
|
unsigned sx = oam[n + 1] - 8;
|
||||||
unsigned tile = oam[n + 2];
|
unsigned tile = oam[n + 2] & ~status.ob_size;
|
||||||
unsigned attr = oam[n + 3];
|
unsigned attr = oam[n + 3];
|
||||||
|
|
||||||
sy = status.ly - sy;
|
sy = status.ly - sy;
|
||||||
|
|
|
@ -27,7 +27,7 @@ void Application::run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::Application(int argc, char **argv) {
|
Application::Application(int argc, char **argv) {
|
||||||
title = "bsnes v084.05";
|
title = "bsnes v084.06";
|
||||||
|
|
||||||
application = this;
|
application = this;
|
||||||
quit = false;
|
quit = false;
|
||||||
|
|
Loading…
Reference in New Issue