Merge branch 'master' into dc11-serial

This commit is contained in:
folkert van heusden 2024-05-09 16:14:11 +02:00
commit 52f38c0b6b
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
2 changed files with 71 additions and 52 deletions

View file

@ -110,7 +110,7 @@ void console_esp32::panel_update_thread()
int run_mode = current_PSW >> 14;
uint16_t current_PC = c->getPC();
uint32_t full_addr = b->calculate_physical_address(run_mode, current_PC, false, false, true, i_space);
uint32_t full_addr = b->getMMU()->calculate_physical_address(c, run_mode, current_PC, false, false, true, i_space);
uint16_t current_instr = b->read_word(current_PC);

121
rk05.cpp
View file

@ -62,17 +62,17 @@ uint16_t rk05::read_word(const uint16_t addr)
if (addr == RK05_DS) { // 0177400
setBit(registers[reg], 11, true); // disk on-line
setBit(registers[reg], 8, true); // sector ok
setBit(registers[reg], 7, true); // drive ready
setBit(registers[reg], 6, true); // seek ready
setBit(registers[reg], 4, true); // heads in position
setBit(registers[reg], 8, true); // sector ok
setBit(registers[reg], 7, true); // drive ready
setBit(registers[reg], 6, true); // seek ready
setBit(registers[reg], 4, true); // heads in position
}
else if (addr == RK05_ERROR) // 0177402
registers[reg] = 0;
else if (addr == RK05_CS) { // 0177404
setBit(registers[reg], 15, false); // clear error
setBit(registers[reg], 14, false); // clear hard error
setBit(registers[reg], 7, true); // controller ready
setBit(registers[reg], 7, true); // controller ready
}
uint16_t vtemp = registers[reg];
@ -139,45 +139,56 @@ void rk05::write_word(const uint16_t addr, const uint16_t v)
if (func == 0) { // controller reset
TRACE("RK05 invoke %d (controller reset)", func);
registers[(RK05_ERROR - RK05_BASE) / 2] = 0;
}
else if (func == 1) { // write
*disk_write_acitivity = true;
TRACE("RK05 drive %d position sec %d surf %d cyl %d, reclen %zo, WRITE to %o, mem: %o", device, sector, surface, cylinder, reclen, diskoffb, memoff);
uint32_t work_reclen = reclen;
uint32_t work_memoff = memoff;
uint32_t work_diskoffb = diskoffb;
if (device >= fhs.size()) {
registers[(RK05_ERROR - RK05_BASE) / 2] |= 128; // non existing disk
registers[(RK05_CS - RK05_BASE) / 2] |= 3 << 14; // an error occured
}
else {
uint32_t work_reclen = reclen;
uint32_t work_memoff = memoff;
uint32_t work_diskoffb = diskoffb;
assert(sizeof(xfer_buffer) == 512);
assert(sizeof(xfer_buffer) == 512);
while(work_reclen > 0) {
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), work_reclen);
work_reclen -= cur;
while(work_reclen > 0) {
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), work_reclen);
work_reclen -= cur;
for(size_t i=0; i<cur; i++)
xfer_buffer[i] = b->readUnibusByte(work_memoff++);
for(size_t i=0; i<cur; i++)
xfer_buffer[i] = b->readUnibusByte(work_memoff++);
if (!fhs.at(device)->write(work_diskoffb, cur, xfer_buffer, 512))
DOLOG(ll_error, true, "RK05(%d) write error %s to %u len %u", device, strerror(errno), work_diskoffb, cur);
if (!fhs.at(device)->write(work_diskoffb, cur, xfer_buffer, 512)) {
DOLOG(ll_error, true, "RK05(%d) write error %s to %u len %u", device, strerror(errno), work_diskoffb, cur);
registers[(RK05_ERROR - RK05_BASE) / 2] |= 32; // non existing sector
registers[(RK05_CS - RK05_BASE) / 2] |= 3 << 14; // an error occured
break;
}
work_diskoffb += cur;
work_diskoffb += cur;
if (v & 2048)
TRACE("RK05 inhibit BA increase");
else
update_bus_address(cur);
if (v & 2048)
TRACE("RK05 inhibit BA increase");
else
update_bus_address(cur);
if (++sector >= 12) {
sector = 0;
if (++surface >= 2) {
surface = 0;
cylinder++;
if (++sector >= 12) {
sector = 0;
if (++surface >= 2) {
surface = 0;
cylinder++;
}
}
}
}
registers[(RK05_DA - RK05_BASE) / 2] = sector | (surface << 4) | (cylinder << 5);
registers[(RK05_DA - RK05_BASE) / 2] = sector | (surface << 4) | (cylinder << 5);
}
*disk_write_acitivity = false;
}
@ -186,40 +197,48 @@ void rk05::write_word(const uint16_t addr, const uint16_t v)
TRACE("RK05 drive %d position sec %d surf %d cyl %d, reclen %zo, READ from %o, mem: %o", device, sector, surface, cylinder, reclen, diskoffb, memoff);
uint32_t temp_diskoffb = diskoffb;
if (device >= fhs.size()) {
registers[(RK05_ERROR - RK05_BASE) / 2] |= 128; // non existing disk
registers[(RK05_CS - RK05_BASE) / 2] |= 3 << 14; // an error occured
}
else {
uint32_t temp_diskoffb = diskoffb;
uint32_t temp_reclen = reclen;
uint32_t p = memoff;
while(temp_reclen > 0) {
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), temp_reclen);
uint32_t temp_reclen = reclen;
uint32_t p = memoff;
while(temp_reclen > 0) {
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), temp_reclen);
if (!fhs.at(device)->read(temp_diskoffb, cur, xfer_buffer, 512)) {
DOLOG(ll_error, true, "RK05 read error %s from %u len %u", strerror(errno), temp_diskoffb, cur);
break;
}
if (!fhs.at(device)->read(temp_diskoffb, cur, xfer_buffer, 512)) {
DOLOG(ll_error, true, "RK05 read error %s from %u len %u", strerror(errno), temp_diskoffb, cur);
registers[(RK05_ERROR - RK05_BASE) / 2] |= 32; // non existing sector
registers[(RK05_CS - RK05_BASE) / 2] |= 3 << 14; // an error occured
break;
}
temp_diskoffb += cur;
temp_diskoffb += cur;
for(uint32_t i=0; i<cur; i++) {
b->writeUnibusByte(p++, xfer_buffer[i]);
for(uint32_t i=0; i<cur; i++) {
b->writeUnibusByte(p++, xfer_buffer[i]);
if ((v & 2048) == 0)
update_bus_address(2);
}
if ((v & 2048) == 0)
update_bus_address(2);
}
temp_reclen -= cur;
temp_reclen -= cur;
if (++sector >= 12) {
sector = 0;
if (++sector >= 12) {
sector = 0;
if (++surface >= 2) {
surface = 0;
cylinder++;
if (++surface >= 2) {
surface = 0;
cylinder++;
}
}
}
}
registers[(RK05_DA - RK05_BASE) / 2] = sector | (surface << 4) | (cylinder << 5);
registers[(RK05_DA - RK05_BASE) / 2] = sector | (surface << 4) | (cylinder << 5);
}
*disk_read_acitivity = false;
}