diff --git a/cpu.cpp b/cpu.cpp index 18854a6..e5d7ef4 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -1415,8 +1415,8 @@ bool cpu::single_operand_instructions(const uint16_t instr) b->mmudebug(a.addr.value()); a.mode_selection = rm_prev; - a.space = word_mode == wm_byte ? d_space : i_space; - set_flags = putGAM(a, v); + a.space = word_mode == wm_byte ? d_space : i_space; + set_flags = putGAM(a, v); } if (set_flags) diff --git a/dc11.cpp b/dc11.cpp index c61d26d..4ff573b 100644 --- a/dc11.cpp +++ b/dc11.cpp @@ -70,6 +70,8 @@ void dc11::operator()() continue; } + set_nodelay(pfds[i].fd); + sockaddr_in listen_addr; memset(&listen_addr, 0, sizeof(listen_addr)); listen_addr.sin_family = AF_INET; @@ -115,6 +117,7 @@ void dc11::operator()() } pfds[client_i].fd = accept(pfds[i].fd, nullptr, nullptr); + set_nodelay(pfds[client_i].fd); registers[i * 4 + 0] |= 0160000; // "ERROR", RING INDICATOR, CARRIER TRANSITION if (is_rx_interrupt_enabled(i)) diff --git a/utils.cpp b/utils.cpp index 1e5f294..9579737 100644 --- a/utils.cpp +++ b/utils.cpp @@ -6,7 +6,11 @@ #if defined(ESP32) || defined(BUILD_FOR_RP2040) #include #include "rp2040.h" +#else +#include +#include #endif +#include #include #include @@ -23,6 +27,8 @@ #include "win32.h" #endif +#include "log.h" + void setBit(uint16_t & v, const int bit, const bool vb) { @@ -236,3 +242,14 @@ void update_word(uint16_t *const w, const bool msb, const uint8_t v) (*w) |= v; } } + +void set_nodelay(const int fd) +{ + int flags = 1; +#if defined(__FreeBSD__) || defined(ESP32) + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void *)&flags, sizeof(flags)) == -1) +#else + if (setsockopt(fd, SOL_TCP, TCP_NODELAY, (void *)&flags, sizeof(flags)) == -1) +#endif + DOLOG(warning, true, "Cannot disable nagle algorithm"); +} diff --git a/utils.h b/utils.h index be27c83..b5590f2 100644 --- a/utils.h +++ b/utils.h @@ -25,3 +25,5 @@ ssize_t WRITE(int fd, const char *whereto, size_t len); ssize_t READ(int fd, char *whereto, size_t len); void update_word(uint16_t *const w, const bool msb, const uint8_t v); + +void set_nodelay(const int fd);