diff --git a/bsnes/nall/snes/cartridge.hpp b/bsnes/nall/snes/cartridge.hpp
index 858bbacf..48d32720 100755
--- a/bsnes/nall/snes/cartridge.hpp
+++ b/bsnes/nall/snes/cartridge.hpp
@@ -338,11 +338,14 @@ SNESCartridge::SNESCartridge(const uint8_t *data, unsigned size) {
xml << " \n";
xml << " \n";
} else if(mapper == BSXROM) {
- xml << " \n";
- xml << " \n";
- xml << " \n";
- xml << " \n";
xml << " \n";
+ xml << " \n";
+ xml << " \n";
+ xml << " \n";
+ xml << " \n";
+ xml << " \n";
+ xml << " \n";
+ xml << " \n";
xml << " \n";
xml << " \n";
xml << " \n";
diff --git a/bsnes/snes/Makefile b/bsnes/snes/Makefile
index bdd2125d..3c3e16a1 100755
--- a/bsnes/snes/Makefile
+++ b/bsnes/snes/Makefile
@@ -45,7 +45,7 @@ obj/snes-icd2.o : $(snes)/chip/icd2/icd2.cpp $(call rwildcard,$(snes)/chip/ic
obj/snes-superfx.o : $(snes)/chip/superfx/superfx.cpp $(call rwildcard,$(snes)/chip/superfx/)
obj/snes-sa1.o : $(snes)/chip/sa1/sa1.cpp $(call rwildcard,$(snes)/chip/sa1/)
obj/snes-necdsp.o : $(snes)/chip/necdsp/necdsp.cpp $(call rwildcard,$(snes)/chip/necdsp/)
-obj/snes-bsx.o : $(snes)/chip/bsx/bsx.cpp $(snes)/chip/bsx/*
+obj/snes-bsx.o : $(snes)/chip/bsx/bsx.cpp $(call rwildcard,$(snes)/chip/bsx/)
obj/snes-srtc.o : $(snes)/chip/srtc/srtc.cpp $(snes)/chip/srtc/*
obj/snes-sdd1.o : $(snes)/chip/sdd1/sdd1.cpp $(snes)/chip/sdd1/*
obj/snes-spc7110.o : $(snes)/chip/spc7110/spc7110.cpp $(snes)/chip/spc7110/*
diff --git a/bsnes/snes/cartridge/cartridge.cpp b/bsnes/snes/cartridge/cartridge.cpp
index c33375e5..b054afd5 100755
--- a/bsnes/snes/cartridge/cartridge.cpp
+++ b/bsnes/snes/cartridge/cartridge.cpp
@@ -38,7 +38,7 @@ void Cartridge::load(Mode cartridge_mode, const lstring &xml_list) {
has_serial = false;
parse_xml(xml_list);
-//print(xml_list[0], "\n\n");
+ print(xml_list[0], "\n\n");
if(ram_size > 0) {
memory::cartram.map(allocate(ram_size, 0xff), ram_size);
diff --git a/bsnes/snes/cartridge/xml.cpp b/bsnes/snes/cartridge/xml.cpp
index ac579989..d7713dd3 100755
--- a/bsnes/snes/cartridge/xml.cpp
+++ b/bsnes/snes/cartridge/xml.cpp
@@ -355,6 +355,16 @@ void Cartridge::xml_parse_bsx(xml_element &root) {
mapping.append(m);
}
}
+ } else if(node.name == "mcu") {
+ foreach(leaf, node.element) {
+ if(leaf.name == "map") {
+ Mapping m({ &BSXCart::mcu_read, &bsxcart }, { &BSXCart::mcu_write, &bsxcart });
+ foreach(attr, leaf.attribute) {
+ if(attr.name == "address") xml_parse_address(m, attr.content);
+ }
+ mapping.append(m);
+ }
+ }
} else if(node.name == "mmio") {
foreach(leaf, node.element) {
if(leaf.name == "map") {
diff --git a/bsnes/snes/chip/bsx/bsx.cpp b/bsnes/snes/chip/bsx/bsx.cpp
index a22798f1..450c0423 100755
--- a/bsnes/snes/chip/bsx/bsx.cpp
+++ b/bsnes/snes/chip/bsx/bsx.cpp
@@ -2,7 +2,7 @@
#define BSX_CPP
namespace SNES {
- #include "bsx_base.cpp"
- #include "bsx_cart.cpp"
- #include "bsx_flash.cpp"
+ #include "satellaview/satellaview.cpp"
+ #include "cartridge/cartridge.cpp"
+ #include "flash/flash.cpp"
}
diff --git a/bsnes/snes/chip/bsx/bsx.hpp b/bsnes/snes/chip/bsx/bsx.hpp
index 1175a28a..5f3895bd 100755
--- a/bsnes/snes/chip/bsx/bsx.hpp
+++ b/bsnes/snes/chip/bsx/bsx.hpp
@@ -1,71 +1,3 @@
-class BSXBase {
-public:
- void init();
- void enable();
- void power();
- void reset();
-
- uint8 mmio_read(unsigned addr);
- void mmio_write(unsigned addr, uint8 data);
-
-private:
- struct {
- uint8 r2188, r2189, r218a, r218b;
- uint8 r218c, r218d, r218e, r218f;
- uint8 r2190, r2191, r2192, r2193;
- uint8 r2194, r2195, r2196, r2197;
- uint8 r2198, r2199, r219a, r219b;
- uint8 r219c, r219d, r219e, r219f;
-
- uint8 r2192_counter;
- uint8 r2192_hour, r2192_minute, r2192_second;
- } regs;
-};
-
-class BSXCart {
-public:
- void init();
- void enable();
- void power();
- void reset();
-
- uint8 mmio_read(unsigned addr);
- void mmio_write(unsigned addr, uint8 data);
-
- BSXCart();
- ~BSXCart();
-
-private:
- struct {
- uint8 r[16];
- } regs;
-
- void update_memory_map();
-};
-
-class BSXFlash {
-public:
- void init();
- void enable();
- void power();
- void reset();
-
- unsigned size() const;
- uint8 read(unsigned addr);
- void write(unsigned addr, uint8 data);
-
-private:
- struct {
- unsigned command;
- uint8 write_old;
- uint8 write_new;
-
- bool flash_enable;
- bool read_enable;
- bool write_enable;
- } regs;
-};
-
-extern BSXBase bsxbase;
-extern BSXCart bsxcart;
-extern BSXFlash bsxflash;
+#include "satellaview/satellaview.hpp"
+#include "cartridge/cartridge.hpp"
+#include "flash/flash.hpp"
diff --git a/bsnes/snes/chip/bsx/bsx_cart.cpp b/bsnes/snes/chip/bsx/bsx_cart.cpp
deleted file mode 100755
index a1e83852..00000000
--- a/bsnes/snes/chip/bsx/bsx_cart.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifdef BSX_CPP
-
-BSXCart bsxcart;
-
-void BSXCart::init() {
-}
-
-void BSXCart::enable() {
-}
-
-void BSXCart::power() {
- reset();
-}
-
-void BSXCart::reset() {
- for(unsigned i = 0; i < 16; i++) regs.r[i] = 0x00;
- regs.r[0x07] = 0x80;
- regs.r[0x08] = 0x80;
-
- update_memory_map();
-}
-
-void BSXCart::update_memory_map() {
- Memory &cart = (regs.r[0x01] & 0x80) == 0x00 ? (Memory&)bsxflash : (Memory&)memory::bsxpram;
-
- if((regs.r[0x02] & 0x80) == 0x00) {
- //LoROM mapping
-// bus.map(Bus::MapMode::Linear, 0x00, 0x7d, 0x8000, 0xffff, cart);
-// bus.map(Bus::MapMode::Linear, 0x80, 0xff, 0x8000, 0xffff, cart);
- } else {
- //HiROM mapping
-// bus.map(Bus::MapMode::Shadow, 0x00, 0x3f, 0x8000, 0xffff, cart);
-// bus.map(Bus::MapMode::Linear, 0x40, 0x7d, 0x0000, 0xffff, cart);
-// bus.map(Bus::MapMode::Shadow, 0x80, 0xbf, 0x8000, 0xffff, cart);
-// bus.map(Bus::MapMode::Linear, 0xc0, 0xff, 0x0000, 0xffff, cart);
- }
-
- if(regs.r[0x03] & 0x80) {
-// bus.map(Bus::MapMode::Linear, 0x60, 0x6f, 0x0000, 0xffff, memory::bsxpram);
- //bus.map(Bus::MapMode::Linear, 0x70, 0x77, 0x0000, 0xffff, memory::bsxpram);
- }
-
- if((regs.r[0x05] & 0x80) == 0x00) {
-// bus.map(Bus::MapMode::Linear, 0x40, 0x4f, 0x0000, 0xffff, memory::bsxpram);
- }
-
- if((regs.r[0x06] & 0x80) == 0x00) {
-// bus.map(Bus::MapMode::Linear, 0x50, 0x5f, 0x0000, 0xffff, memory::bsxpram);
- }
-
- if(regs.r[0x07] & 0x80) {
-// bus.map(Bus::MapMode::Linear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom);
- }
-
- if(regs.r[0x08] & 0x80) {
-// bus.map(Bus::MapMode::Linear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom);
- }
-
-// bus.map(Bus::MapMode::Shadow, 0x20, 0x3f, 0x6000, 0x7fff, memory::bsxpram);
-// bus.map(Bus::MapMode::Linear, 0x70, 0x77, 0x0000, 0xffff, memory::bsxpram);
-}
-
-uint8 BSXCart::mmio_read(unsigned addr) {
- if((addr & 0xf0ffff) == 0x005000) { //$[00-0f]:5000 MMIO
- uint8 n = (addr >> 16) & 15;
- return regs.r[n];
- }
-
- if((addr & 0xf8f000) == 0x105000) { //$[10-17]:[5000-5fff] SRAM
- return memory::bsxram.read(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff));
- }
-
- return 0x00;
-}
-
-void BSXCart::mmio_write(unsigned addr, uint8 data) {
- if((addr & 0xf0ffff) == 0x005000) { //$[00-0f]:5000 MMIO
- uint8 n = (addr >> 16) & 15;
- regs.r[n] = data;
- if(n == 0x0e && data & 0x80) update_memory_map();
- return;
- }
-
- if((addr & 0xf8f000) == 0x105000) { //$[10-17]:[5000-5fff] SRAM
- return memory::bsxram.write(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff), data);
- }
-}
-
-BSXCart::BSXCart() {
-}
-
-BSXCart::~BSXCart() {
-}
-
-#endif
diff --git a/bsnes/snes/chip/bsx/cartridge/cartridge.cpp b/bsnes/snes/chip/bsx/cartridge/cartridge.cpp
new file mode 100755
index 00000000..61a760e8
--- /dev/null
+++ b/bsnes/snes/chip/bsx/cartridge/cartridge.cpp
@@ -0,0 +1,145 @@
+#ifdef BSX_CPP
+
+BSXCart bsxcart;
+
+void BSXCart::init() {
+}
+
+void BSXCart::enable() {
+}
+
+void BSXCart::power() {
+ reset();
+}
+
+void BSXCart::reset() {
+ for(unsigned i = 0; i < 16; i++) r[i] = 0x00;
+ r[0x07] = 0x80;
+ r[0x08] = 0x80;
+ mmio_commit();
+}
+
+uint8 BSXCart::memory_access(bool write, Memory &memory, unsigned addr, uint8 data) {
+ if(write == 0) return memory_read(memory, addr);
+ memory_write(memory, addr, data);
+}
+
+uint8 BSXCart::memory_read(Memory &memory, unsigned addr) {
+ addr = bus.mirror(addr, memory.size());
+ return memory.read(addr);
+}
+
+void BSXCart::memory_write(Memory &memory, unsigned addr, uint8 data) {
+ addr = bus.mirror(addr, memory.size());
+ return memory.write(addr, data);
+}
+
+//mcu_access() allows mcu_read() and mcu_write() to share decoding logic
+uint8 BSXCart::mcu_access(bool write, unsigned addr, uint8 data) {
+ if((addr & 0xe08000) == 0x008000) { //$00-1f:8000-ffff
+ if(r07 == 1) {
+ addr = ((addr & 0x1f0000) >> 1) | (addr & 0x7fff);
+ return memory_access(write, memory::cartrom, addr, data);
+ }
+ }
+
+ if((addr & 0xe08000) == 0x808000) { //$80-9f:8000-ffff
+ if(r08 == 1) {
+ addr = ((addr & 0x1f0000) >> 1) | (addr & 0x7fff);
+ return memory_access(write, memory::cartrom, addr, data);
+ }
+ }
+
+ if((addr & 0xe0e000) == 0x206000) { //$20-3f:6000-7fff
+ return memory_access(write, memory::bsxpram, addr, data);
+ }
+
+ if((addr & 0xf00000) == 0x400000) { //$40-4f:0000-ffff
+ if(r05 == 0) return memory_access(write, memory::bsxpram, addr & 0x0fffff, data);
+ }
+
+ if((addr & 0xf00000) == 0x500000) { //$50-5f:0000-ffff
+ if(r06 == 0) return memory_access(write, memory::bsxpram, addr & 0x0fffff, data);
+ }
+
+ if((addr & 0xf00000) == 0x600000) { //$60-6f:0000-ffff
+ if(r03 == 1) return memory_access(write, memory::bsxpram, addr & 0x0fffff, data);
+ }
+
+ if((addr & 0xf80000) == 0x700000) { //$70-77:0000-ffff
+ return memory_access(write, memory::bsxpram, addr & 0x07ffff, data);
+ }
+
+ if(((addr & 0xc08000) == 0x008000) //$00-3f:8000-ffff
+ || ((addr & 0xc00000) == 0x400000) //$40-7f:0000-ffff
+ || ((addr & 0xc08000) == 0x808000) //$80-bf:8000-ffff
+ || ((addr & 0xc00000) == 0xc00000) //$c0-ff:0000-ffff
+ ) {
+ if(r02 == 0) addr = ((addr & 0x7f0000) >> 1) | (addr & 0x7fff);
+ Memory &memory = (r01 == 0 ? (Memory&)bsxflash : (Memory&)memory::bsxpram);
+ return memory_access(write, memory, addr & 0x7fffff, data);
+ }
+
+ return cpu.regs.mdr;
+}
+
+uint8 BSXCart::mcu_read(unsigned addr) {
+ return mcu_access(0, addr);
+}
+
+void BSXCart::mcu_write(unsigned addr, uint8 data) {
+ mcu_access(1, addr, data);
+}
+
+uint8 BSXCart::mmio_read(unsigned addr) {
+ if((addr & 0xf0ffff) == 0x005000) { //$00-0f:5000 MMIO
+ uint8 n = (addr >> 16) & 15;
+ return r[n];
+ }
+
+ if((addr & 0xf8f000) == 0x105000) { //$10-17:5000-5fff SRAM
+ return memory_read(memory::bsxram, ((addr >> 16) & 7) * 0x1000 + (addr & 0xfff));
+ }
+
+ return 0x00;
+}
+
+void BSXCart::mmio_write(unsigned addr, uint8 data) {
+ if((addr & 0xf0ffff) == 0x005000) { //$00-0f:5000 MMIO
+ uint8 n = (addr >> 16) & 15;
+ r[n] = data;
+ if(n == 0x0e && data & 0x80) mmio_commit();
+ return;
+ }
+
+ if((addr & 0xf8f000) == 0x105000) { //$10-17:5000-5fff SRAM
+ return memory_write(memory::bsxram, ((addr >> 16) & 7) * 0x1000 + (addr & 0xfff), data);
+ }
+}
+
+void BSXCart::mmio_commit() {
+ r00 = r[0x00] & 0x80;
+ r01 = r[0x01] & 0x80;
+ r02 = r[0x02] & 0x80;
+ r03 = r[0x03] & 0x80;
+ r04 = r[0x04] & 0x80;
+ r05 = r[0x05] & 0x80;
+ r06 = r[0x06] & 0x80;
+ r07 = r[0x07] & 0x80;
+ r08 = r[0x08] & 0x80;
+ r09 = r[0x09] & 0x80;
+ r0a = r[0x0a] & 0x80;
+ r0b = r[0x0b] & 0x80;
+ r0c = r[0x0c] & 0x80;
+ r0d = r[0x0d] & 0x80;
+ r0e = r[0x0e] & 0x80;
+ r0f = r[0x0f] & 0x80;
+}
+
+BSXCart::BSXCart() {
+}
+
+BSXCart::~BSXCart() {
+}
+
+#endif
diff --git a/bsnes/snes/chip/bsx/cartridge/cartridge.hpp b/bsnes/snes/chip/bsx/cartridge/cartridge.hpp
new file mode 100755
index 00000000..bfe3daa6
--- /dev/null
+++ b/bsnes/snes/chip/bsx/cartridge/cartridge.hpp
@@ -0,0 +1,31 @@
+class BSXCart {
+public:
+ void init();
+ void enable();
+ void power();
+ void reset();
+
+ uint8 memory_access(bool write, Memory &memory, unsigned addr, uint8 data);
+ uint8 memory_read(Memory &memory, unsigned addr);
+ void memory_write(Memory &memory, unsigned addr, uint8 data);
+
+ uint8 mcu_access(bool write, unsigned addr, uint8 data = 0x00);
+ uint8 mcu_read(unsigned addr);
+ void mcu_write(unsigned addr, uint8 data);
+
+ uint8 mmio_read(unsigned addr);
+ void mmio_write(unsigned addr, uint8 data);
+ void mmio_commit();
+
+ BSXCart();
+ ~BSXCart();
+
+private:
+ uint8 r[16];
+ bool r00, r01, r02, r03;
+ bool r04, r05, r06, r07;
+ bool r08, r09, r0a, r0b;
+ bool r0c, r0d, r0e, r0f;
+};
+
+extern BSXCart bsxcart;
diff --git a/bsnes/snes/chip/bsx/bsx_flash.cpp b/bsnes/snes/chip/bsx/flash/flash.cpp
similarity index 99%
rename from bsnes/snes/chip/bsx/bsx_flash.cpp
rename to bsnes/snes/chip/bsx/flash/flash.cpp
index a4297a2b..1eb4ecd1 100755
--- a/bsnes/snes/chip/bsx/bsx_flash.cpp
+++ b/bsnes/snes/chip/bsx/flash/flash.cpp
@@ -116,4 +116,3 @@ void BSXFlash::write(unsigned addr, uint8 data) {
}
#endif
-
diff --git a/bsnes/snes/chip/bsx/flash/flash.hpp b/bsnes/snes/chip/bsx/flash/flash.hpp
new file mode 100755
index 00000000..91e760f1
--- /dev/null
+++ b/bsnes/snes/chip/bsx/flash/flash.hpp
@@ -0,0 +1,24 @@
+class BSXFlash : public Memory {
+public:
+ void init();
+ void enable();
+ void power();
+ void reset();
+
+ unsigned size() const;
+ uint8 read(unsigned addr);
+ void write(unsigned addr, uint8 data);
+
+private:
+ struct {
+ unsigned command;
+ uint8 write_old;
+ uint8 write_new;
+
+ bool flash_enable;
+ bool read_enable;
+ bool write_enable;
+ } regs;
+};
+
+extern BSXFlash bsxflash;
diff --git a/bsnes/snes/chip/bsx/bsx_base.cpp b/bsnes/snes/chip/bsx/satellaview/satellaview.cpp
similarity index 99%
rename from bsnes/snes/chip/bsx/bsx_base.cpp
rename to bsnes/snes/chip/bsx/satellaview/satellaview.cpp
index 472eedb0..1588fdbe 100755
--- a/bsnes/snes/chip/bsx/bsx_base.cpp
+++ b/bsnes/snes/chip/bsx/satellaview/satellaview.cpp
@@ -139,4 +139,3 @@ void BSXBase::mmio_write(unsigned addr, uint8 data) {
}
#endif
-
diff --git a/bsnes/snes/chip/bsx/satellaview/satellaview.hpp b/bsnes/snes/chip/bsx/satellaview/satellaview.hpp
new file mode 100755
index 00000000..985e8318
--- /dev/null
+++ b/bsnes/snes/chip/bsx/satellaview/satellaview.hpp
@@ -0,0 +1,25 @@
+class BSXBase {
+public:
+ void init();
+ void enable();
+ void power();
+ void reset();
+
+ uint8 mmio_read(unsigned addr);
+ void mmio_write(unsigned addr, uint8 data);
+
+private:
+ struct {
+ uint8 r2188, r2189, r218a, r218b;
+ uint8 r218c, r218d, r218e, r218f;
+ uint8 r2190, r2191, r2192, r2193;
+ uint8 r2194, r2195, r2196, r2197;
+ uint8 r2198, r2199, r219a, r219b;
+ uint8 r219c, r219d, r219e, r219f;
+
+ uint8 r2192_counter;
+ uint8 r2192_hour, r2192_minute, r2192_second;
+ } regs;
+};
+
+extern BSXBase bsxbase;
diff --git a/bsnes/snes/snes.hpp b/bsnes/snes/snes.hpp
index 7970a041..02b97eff 100755
--- a/bsnes/snes/snes.hpp
+++ b/bsnes/snes/snes.hpp
@@ -1,7 +1,7 @@
namespace SNES {
namespace Info {
static const char Name[] = "bsnes";
- static const char Version[] = "074.08";
+ static const char Version[] = "074.09";
static const unsigned SerializerVersion = 17;
}
}