flags update & initialization of client fds fix
This commit is contained in:
parent
b4a3ce363c
commit
9d70c419c0
1 changed files with 21 additions and 19 deletions
40
dc11.cpp
40
dc11.cpp
|
@ -45,7 +45,7 @@ void dc11::operator()()
|
||||||
|
|
||||||
for(int i=0; i<dc11_n_lines; i++) {
|
for(int i=0; i<dc11_n_lines; i++) {
|
||||||
// client session
|
// client session
|
||||||
pfds[dc11_n_lines + i].fd = socket(AF_INET, SOCK_STREAM, 0);
|
pfds[dc11_n_lines + i].fd = -1;
|
||||||
pfds[dc11_n_lines + i].events = POLLIN;
|
pfds[dc11_n_lines + i].events = POLLIN;
|
||||||
|
|
||||||
// listen on port
|
// listen on port
|
||||||
|
@ -117,7 +117,7 @@ void dc11::operator()()
|
||||||
char buffer[32] { };
|
char buffer[32] { };
|
||||||
int rc = read(pfds[i].fd, buffer, sizeof buffer);
|
int rc = read(pfds[i].fd, buffer, sizeof buffer);
|
||||||
if (rc <= 0) { // closed or error?
|
if (rc <= 0) { // closed or error?
|
||||||
DOLOG(info, false, "Failed reading on port %d", i - dc11_n_lines + 1);
|
DOLOG(info, false, "Failed reading from port %d", i - dc11_n_lines + 1);
|
||||||
close(pfds[i].fd);
|
close(pfds[i].fd);
|
||||||
pfds[i].fd = -1;
|
pfds[i].fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -137,19 +137,6 @@ void dc11::operator()()
|
||||||
have_data[line_nr].notify_all();
|
have_data[line_nr].notify_all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// emulate DTR, CTS & READY
|
|
||||||
for(int i=0; i<dc11_n_lines; i++) {
|
|
||||||
registers[i * 4 + 0] &= ~1; // DTR: bit 0
|
|
||||||
registers[i * 4 + 2] &= ~2; // CTS: bit 1
|
|
||||||
registers[i * 4 + 2] &= ~128; // READY: bit 7
|
|
||||||
|
|
||||||
if (pfds[i + dc11_n_lines].fd != -1) {
|
|
||||||
registers[i * 4 + 0] |= 1;
|
|
||||||
registers[i * 4 + 2] |= 2;
|
|
||||||
registers[i * 4 + 2] |= 128;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DOLOG(info, true, "DC11 thread terminating");
|
DOLOG(info, true, "DC11 thread terminating");
|
||||||
|
@ -179,6 +166,21 @@ uint16_t dc11::read_word(const uint16_t addr)
|
||||||
int reg = (addr - DC11_BASE) / 2;
|
int reg = (addr - DC11_BASE) / 2;
|
||||||
int line_nr = reg / 4;
|
int line_nr = reg / 4;
|
||||||
|
|
||||||
|
// emulate DTR, CTS & READY
|
||||||
|
for(int i=0; i<dc11_n_lines; i++) {
|
||||||
|
registers[i * 4 + 0] &= ~1; // DTR: bit 0
|
||||||
|
registers[i * 4 + 0] &= ~4; // CD : bit 2
|
||||||
|
registers[i * 4 + 2] &= ~2; // CTS: bit 1
|
||||||
|
registers[i * 4 + 2] &= ~128; // READY: bit 7
|
||||||
|
|
||||||
|
if (pfds[i + dc11_n_lines].fd != -1) {
|
||||||
|
registers[i * 4 + 0] |= 1;
|
||||||
|
registers[i * 4 + 0] |= 4;
|
||||||
|
registers[i * 4 + 2] |= 2;
|
||||||
|
registers[i * 4 + 2] |= 128;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t vtemp = registers[reg];
|
uint16_t vtemp = registers[reg];
|
||||||
|
|
||||||
if ((reg & 3) == 1) { // read data register
|
if ((reg & 3) == 1) { // read data register
|
||||||
|
@ -200,8 +202,8 @@ uint16_t dc11::read_word(const uint16_t addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DOLOG(debug, true, "DC11: read register %06o (%d): %06o", addr, reg, vtemp);
|
DOLOG(debug, true, "DC11: read register %06o (%d line %d): %06o", addr, reg, line_nr, vtemp);
|
||||||
printf("DC11: read register %06o (%d): %06o\r\n", addr, reg, vtemp);
|
printf("DC11: read register %06o (%d line %d): %06o\r\n", addr, reg, line_nr, vtemp);
|
||||||
|
|
||||||
return vtemp;
|
return vtemp;
|
||||||
}
|
}
|
||||||
|
@ -227,8 +229,8 @@ void dc11::write_word(const uint16_t addr, uint16_t v)
|
||||||
int reg = (addr - DC11_BASE) / 2;
|
int reg = (addr - DC11_BASE) / 2;
|
||||||
int line_nr = reg / 4;
|
int line_nr = reg / 4;
|
||||||
|
|
||||||
DOLOG(debug, true, "DC11: write register %06o (%d) to %06o", addr, reg, v);
|
DOLOG(debug, true, "DC11: write register %06o (%d line_nr %d) to %06o", addr, reg, line_nr, v);
|
||||||
printf("DC11: write register %06o (%d) to %06o\r\n", addr, reg, v);
|
printf("DC11: write register %06o (%d line_nr %d) to %06o\r\n", addr, reg, line_nr, v);
|
||||||
|
|
||||||
if ((reg & 3) == 3) { // transmit buffer
|
if ((reg & 3) == 3) { // transmit buffer
|
||||||
char c = v;
|
char c = v;
|
||||||
|
|
Loading…
Add table
Reference in a new issue