diff --git a/bsnes/nall/function.hpp b/bsnes/nall/function.hpp index 76995dd7..39612fd7 100755 --- a/bsnes/nall/function.hpp +++ b/bsnes/nall/function.hpp @@ -1,7 +1,7 @@ #ifndef NALL_FUNCTION_HPP #define NALL_FUNCTION_HPP -#include +#include #include #include diff --git a/bsnes/nall/serial.hpp b/bsnes/nall/serial.hpp index 6f5cf6d6..9ac8451a 100755 --- a/bsnes/nall/serial.hpp +++ b/bsnes/nall/serial.hpp @@ -23,7 +23,7 @@ namespace nall { return ::write(port, (void*)data, length); } - bool open(const char *portname, unsigned rate) { + bool open(const char *portname, unsigned rate, bool flowcontrol) { close(); port = ::open(portname, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); @@ -41,8 +41,13 @@ namespace nall { attr.c_iflag &=~ (BRKINT | PARMRK | INPCK | ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IXANY); attr.c_iflag |= (IGNBRK | IGNPAR); attr.c_oflag &=~ (OPOST); - attr.c_cflag &=~ (CSIZE | CSTOPB | PARENB); - attr.c_cflag |= (CS8 | CREAD | CLOCAL); + attr.c_cflag &=~ (CSIZE | CSTOPB | PARENB | CLOCAL); + attr.c_cflag |= (CS8 | CREAD); + if(flowcontrol == false) { + attr.c_cflag &= ~CRTSCTS; + } else { + attr.c_cflag |= CRTSCTS; + } attr.c_cc[VTIME] = attr.c_cc[VMIN] = 0; if(tcsetattr(port, TCSANOW, &attr) == -1) { close(); return false; } diff --git a/bsnes/snes/cartridge/cartridge.cpp b/bsnes/snes/cartridge/cartridge.cpp index c1a41e4f..c41931f1 100755 --- a/bsnes/snes/cartridge/cartridge.cpp +++ b/bsnes/snes/cartridge/cartridge.cpp @@ -27,7 +27,6 @@ void Cartridge::load(Mode cartridge_mode, const lstring &xml_list) { supergameboy_version = SuperGameBoyVersion::Version1; supergameboy_ram_size = 0; supergameboy_rtc_size = 0; - serial_baud_rate = 57600; has_bsx_slot = false; has_superfx = false; diff --git a/bsnes/snes/cartridge/cartridge.hpp b/bsnes/snes/cartridge/cartridge.hpp index 8c849a33..9c9a2004 100755 --- a/bsnes/snes/cartridge/cartridge.hpp +++ b/bsnes/snes/cartridge/cartridge.hpp @@ -33,7 +33,6 @@ public: readonly supergameboy_version; readonly supergameboy_ram_size; readonly supergameboy_rtc_size; - readonly serial_baud_rate; readonly has_bsx_slot; readonly has_superfx; diff --git a/bsnes/snes/cartridge/xml.cpp b/bsnes/snes/cartridge/xml.cpp index 553183a7..ae0056d7 100755 --- a/bsnes/snes/cartridge/xml.cpp +++ b/bsnes/snes/cartridge/xml.cpp @@ -608,12 +608,6 @@ void Cartridge::xml_parse_msu1(xml_element &root) { void Cartridge::xml_parse_serial(xml_element &root) { has_serial = true; - - foreach(attr, root.attribute) { - if(attr.name == "baud") { - serial_baud_rate = strunsigned(attr.content); - } - } } void Cartridge::xml_parse_address(Mapping &m, const string &data) { diff --git a/bsnes/snes/chip/serial/serial.cpp b/bsnes/snes/chip/serial/serial.cpp index d8adfe44..cc50fcca 100755 --- a/bsnes/snes/chip/serial/serial.cpp +++ b/bsnes/snes/chip/serial/serial.cpp @@ -14,9 +14,11 @@ static void snesserial_write(uint8 data) { serial.write(data); } void Serial::Enter() { serial.enter(); } void Serial::enter() { - latch = 0; + data1 = 0; + data2 = 0; add_clocks(256 * 8); //warm-up - if(snesserial_main) snesserial_main(snesserial_tick, snesserial_read, snesserial_write); + if(flowcontrol()) data2 = 1; + if(main) main(snesserial_tick, snesserial_read, snesserial_write); while(true) add_clocks(frequency); //snesserial_main() fallback } @@ -40,16 +42,19 @@ uint8 Serial::read() { } void Serial::write(uint8 data) { - latch = 1; + if(flowcontrol()) while(cpu.pio() & 0x80) add_clocks(1); + add_clocks(8); + + data1 = 1; add_clocks(8); for(unsigned i = 0; i < 8; i++) { - latch = (data & 1) ^ 1; + data1 = (data & 1) ^ 1; data >>= 1; add_clocks(8); } - latch = 0; + data1 = 0; add_clocks(8); } @@ -82,7 +87,9 @@ void Serial::enable() { string name = notdir(cartridge.basename()); string path = dir(cartridge.basename()); if(open(name, path)) { - snesserial_main = sym("snesserial_main"); + baudrate = sym("snesserial_baudrate"); + flowcontrol = sym("snesserial_flowcontrol"); + main = sym("snesserial_main"); } } @@ -91,7 +98,7 @@ void Serial::power() { } void Serial::reset() { - create(Serial::Enter, cartridge.serial_baud_rate() * 8); + create(Serial::Enter, baudrate() * 8); } } diff --git a/bsnes/snes/chip/serial/serial.hpp b/bsnes/snes/chip/serial/serial.hpp index adb499ed..91cb0e3a 100755 --- a/bsnes/snes/chip/serial/serial.hpp +++ b/bsnes/snes/chip/serial/serial.hpp @@ -8,7 +8,8 @@ public: void reset(); void serialize(serializer&); - readonly latch; + readonly data1; + readonly data2; void add_clocks(unsigned clocks); uint8 read(); @@ -19,7 +20,9 @@ public: private: MMIO *r4016, *r4017; - function snesserial_main; + function baudrate; + function flowcontrol; + function main; }; extern Serial serial; diff --git a/bsnes/snes/chip/serial/serialization.cpp b/bsnes/snes/chip/serial/serialization.cpp index 8b2a318a..6a897c70 100755 --- a/bsnes/snes/chip/serial/serialization.cpp +++ b/bsnes/snes/chip/serial/serialization.cpp @@ -2,7 +2,8 @@ void Serial::serialize(serializer &s) { Processor::serialize(s); - s.integer((bool&)latch); + s.integer((bool&)data1); + s.integer((bool&)data2); } #endif diff --git a/bsnes/snes/input/input.cpp b/bsnes/snes/input/input.cpp index dbd3ad71..b9f0a564 100755 --- a/bsnes/snes/input/input.cpp +++ b/bsnes/snes/input/input.cpp @@ -4,7 +4,7 @@ Input input; uint8 Input::port_read(bool portnumber) { if(cartridge.has_serial() && portnumber == 1) { - return serial.latch(); + return (serial.data2() << 1) | (serial.data1() << 0); } port_t &p = port[portnumber]; diff --git a/bsnes/snes/snes.hpp b/bsnes/snes/snes.hpp index eed424d7..8f0d53f7 100755 --- a/bsnes/snes/snes.hpp +++ b/bsnes/snes/snes.hpp @@ -1,12 +1,12 @@ namespace SNES { namespace Info { static const char Name[] = "bsnes"; - static const char Version[] = "068"; + static const char Version[] = "068.01"; static const unsigned SerializerVersion = 12; } } -//#define DEBUGGER +#define DEBUGGER #define CHEAT_SYSTEM #include