Skip to content

Instantly share code, notes, and snippets.

@brook2
Created December 25, 2013 05:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brook2/8120536 to your computer and use it in GitHub Desktop.
Save brook2/8120536 to your computer and use it in GitHub Desktop.
diff -x higan -x '*.so' -x '*~' -x '*.o' -uNr higan_v093r11/src/gb/cpu/mmio.cpp higan_v093r11_trace/src/gb/cpu/mmio.cpp
--- higan_v093r11/src/gb/cpu/mmio.cpp 2013-12-12 00:42:15.000000000 +0000
+++ higan_v093r11_trace/src/gb/cpu/mmio.cpp 2013-12-24 06:22:02.629748505 +0000
@@ -43,12 +43,36 @@
}
if(addr == 0xff01) { //SB
+ if(status.serial_transfer) {
+ printf("PROHIBITED: SB read during serial transfer\n");
+ if(interface->tracer.open()) {
+ interface->tracer.print("PROHIBITED: SB read during serial transfer\n");
+ interface->tracer.flush();
+ }
+ }
+
+ if(interface->tracer.open()) {
+ char buffer[1024];
+ sprintf(buffer, "SB R 0x%.2x\n", 0xff);
+ interface->tracer.print(buffer);
+ interface->tracer.flush();
+ }
+
return 0xff;
}
if(addr == 0xff02) { //SC
- return (status.serial_transfer << 7)
- | (status.serial_clock << 0);
+ uint8 value = (status.serial_transfer << 7)
+ | (status.serial_clock << 0);
+
+ if(interface->tracer.open()) {
+ char buffer[1024];
+ sprintf(buffer, "SC R 0x%.2x\n", 0xff);
+ interface->tracer.print(buffer);
+ interface->tracer.flush();
+ }
+
+ return value;
}
if(addr == 0xff04) { //DIV
@@ -142,13 +166,35 @@
interface->joypWrite(status.p15, status.p14);
return;
}
-
+
if(addr == 0xff01) { //SB
+ if(status.serial_transfer) {
+ printf("PROHIBITED: SB write during serial transfer\n");
+ if(interface->tracer.open()) {
+ interface->tracer.print("PROHIBITED: SB write during serial transfer\n");
+ interface->tracer.flush();
+ }
+ }
+
+ if(interface->tracer.open()) {
+ char buffer[1024];
+ sprintf(buffer, "SB W 0x%.2x\n", data);
+ interface->tracer.print(buffer);
+ interface->tracer.flush();
+ }
+
status.serial_data = data;
return;
}
if(addr == 0xff02) { //SC
+ if(interface->tracer.open()) {
+ char buffer[1024];
+ sprintf(buffer, "SC W 0x%.2x\n", data);
+ interface->tracer.print(buffer);
+ interface->tracer.flush();
+ }
+
status.serial_transfer = data & 0x80;
status.serial_clock = data & 0x01;
if(status.serial_transfer) status.serial_bits = 8;
diff -x higan -x '*.so' -x '*~' -x '*.o' -uNr higan_v093r11/src/gb/interface/interface.cpp higan_v093r11_trace/src/gb/interface/interface.cpp
--- higan_v093r11/src/gb/interface/interface.cpp 2013-12-17 04:33:14.000000000 +0000
+++ higan_v093r11_trace/src/gb/interface/interface.cpp 2013-12-24 05:34:35.801610725 +0000
@@ -135,6 +135,27 @@
video.generate_palette(mode);
}
+bool Interface::tracerEnable(bool trace) {
+ string pathname = {path(group(ID::ROM)), "debug/"};
+ if(trace == true) directory::create(pathname);
+
+ if(trace == true && !tracer.open()) {
+ for(unsigned n = 0; n <= 999; n++) {
+ string filename = {pathname, "trace-", format<3, '0'>(n), ".log"};
+ if(file::exists(filename)) continue;
+ tracer.open(filename, file::mode::write);
+ return true;
+ }
+ }
+
+ if(trace == false && tracer.open()) {
+ tracer.close();
+ return true;
+ }
+
+ return false;
+}
+
Interface::Interface() {
interface = this;
hook = nullptr;
diff -x higan -x '*.so' -x '*~' -x '*.o' -uNr higan_v093r11/src/gb/interface/interface.hpp higan_v093r11_trace/src/gb/interface/interface.hpp
--- higan_v093r11/src/gb/interface/interface.hpp 2013-12-17 04:33:00.000000000 +0000
+++ higan_v093r11_trace/src/gb/interface/interface.hpp 2013-12-24 05:33:47.901608407 +0000
@@ -60,7 +60,11 @@
void paletteUpdate(PaletteMode mode);
+ bool tracerEnable(bool);
+
Interface();
+
+ file tracer;
private:
vector<Device> device;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment