// (C) 2024 by Folkert van Heusden // Released under MIT license #include #include #include #include #include #include "bus.h" #include "cpu.h" #include "dc11.h" #include "log.h" dc11::dc11(const int base_port, bus *const b): base_port(base_port), b(b) { th = new std::thread(std::ref(*this)); } dc11::~dc11() { stop_flag = true; if (th) { th->join(); delete th; } } void dc11::operator()() { int fds[dc11_n_lines] = { }; pollfd pfds[8] = { }; for(int i=0; i(&listen_addr), sizeof(listen_addr)) == -1) { close(pfds[i].fd); fds[i] = -1; DOLOG(warning, true, "Cannot bind to port %d (DC11)", port); } pfds[i].events = POLLIN; // client session pfds[dc11_n_lines + i].fd = socket(AF_INET, SOCK_STREAM, 0); pfds[dc11_n_lines + i].events = POLLIN; } while(!stop_flag) { int rc = poll(pfds, dc11_n_lines * 2, 100); if (rc == 0) continue; // accept any new session for(int i=0; i lck(input_lock[line_nr]); for(int k=0; kgetCpu()->queue_interrupt(4, 0320 + line_nr * 4); } } } for(int i=0; i> 8; return v; } uint16_t dc11::read_word(const uint16_t addr) { const int reg = (addr - DC11_BASE) / 2; uint16_t vtemp = registers[reg]; DOLOG(debug, false, "DC11: read register %06o (%d): %06o", addr, reg, vtemp); return vtemp; } void dc11::write_byte(const uint16_t addr, const uint8_t v) { uint16_t vtemp = registers[(addr - DC11_BASE) / 2]; if (addr & 1) { vtemp &= ~0xff00; vtemp |= v << 8; } else { vtemp &= ~0x00ff; vtemp |= v; } write_word(addr, vtemp); } void dc11::write_word(const uint16_t addr, uint16_t v) { const int reg = (addr - DC11_BASE) / 2; DOLOG(debug, false, "DC11: write register %06o (%d) to %o", addr, reg, v); registers[reg] = v; }