Merge branch 'master' into dc11-serial
This commit is contained in:
commit
52f38c0b6b
2 changed files with 71 additions and 52 deletions
|
@ -110,7 +110,7 @@ void console_esp32::panel_update_thread()
|
||||||
int run_mode = current_PSW >> 14;
|
int run_mode = current_PSW >> 14;
|
||||||
|
|
||||||
uint16_t current_PC = c->getPC();
|
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);
|
uint16_t current_instr = b->read_word(current_PC);
|
||||||
|
|
||||||
|
|
121
rk05.cpp
121
rk05.cpp
|
@ -62,17 +62,17 @@ uint16_t rk05::read_word(const uint16_t addr)
|
||||||
|
|
||||||
if (addr == RK05_DS) { // 0177400
|
if (addr == RK05_DS) { // 0177400
|
||||||
setBit(registers[reg], 11, true); // disk on-line
|
setBit(registers[reg], 11, true); // disk on-line
|
||||||
setBit(registers[reg], 8, true); // sector ok
|
setBit(registers[reg], 8, true); // sector ok
|
||||||
setBit(registers[reg], 7, true); // drive ready
|
setBit(registers[reg], 7, true); // drive ready
|
||||||
setBit(registers[reg], 6, true); // seek ready
|
setBit(registers[reg], 6, true); // seek ready
|
||||||
setBit(registers[reg], 4, true); // heads in position
|
setBit(registers[reg], 4, true); // heads in position
|
||||||
}
|
}
|
||||||
else if (addr == RK05_ERROR) // 0177402
|
else if (addr == RK05_ERROR) // 0177402
|
||||||
registers[reg] = 0;
|
registers[reg] = 0;
|
||||||
else if (addr == RK05_CS) { // 0177404
|
else if (addr == RK05_CS) { // 0177404
|
||||||
setBit(registers[reg], 15, false); // clear error
|
setBit(registers[reg], 15, false); // clear error
|
||||||
setBit(registers[reg], 14, false); // clear hard 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];
|
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
|
if (func == 0) { // controller reset
|
||||||
TRACE("RK05 invoke %d (controller reset)", func);
|
TRACE("RK05 invoke %d (controller reset)", func);
|
||||||
|
registers[(RK05_ERROR - RK05_BASE) / 2] = 0;
|
||||||
}
|
}
|
||||||
else if (func == 1) { // write
|
else if (func == 1) { // write
|
||||||
*disk_write_acitivity = true;
|
*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);
|
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;
|
if (device >= fhs.size()) {
|
||||||
uint32_t work_memoff = memoff;
|
registers[(RK05_ERROR - RK05_BASE) / 2] |= 128; // non existing disk
|
||||||
uint32_t work_diskoffb = diskoffb;
|
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) {
|
while(work_reclen > 0) {
|
||||||
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), work_reclen);
|
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), work_reclen);
|
||||||
work_reclen -= cur;
|
work_reclen -= cur;
|
||||||
|
|
||||||
for(size_t i=0; i<cur; i++)
|
for(size_t i=0; i<cur; i++)
|
||||||
xfer_buffer[i] = b->readUnibusByte(work_memoff++);
|
xfer_buffer[i] = b->readUnibusByte(work_memoff++);
|
||||||
|
|
||||||
if (!fhs.at(device)->write(work_diskoffb, cur, xfer_buffer, 512))
|
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);
|
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)
|
if (v & 2048)
|
||||||
TRACE("RK05 inhibit BA increase");
|
TRACE("RK05 inhibit BA increase");
|
||||||
else
|
else
|
||||||
update_bus_address(cur);
|
update_bus_address(cur);
|
||||||
|
|
||||||
if (++sector >= 12) {
|
if (++sector >= 12) {
|
||||||
sector = 0;
|
sector = 0;
|
||||||
if (++surface >= 2) {
|
if (++surface >= 2) {
|
||||||
surface = 0;
|
surface = 0;
|
||||||
cylinder++;
|
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;
|
*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);
|
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 temp_reclen = reclen;
|
||||||
uint32_t p = memoff;
|
uint32_t p = memoff;
|
||||||
while(temp_reclen > 0) {
|
while(temp_reclen > 0) {
|
||||||
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), temp_reclen);
|
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), temp_reclen);
|
||||||
|
|
||||||
if (!fhs.at(device)->read(temp_diskoffb, cur, xfer_buffer, 512)) {
|
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);
|
DOLOG(ll_error, true, "RK05 read error %s from %u len %u", strerror(errno), temp_diskoffb, cur);
|
||||||
break;
|
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++) {
|
for(uint32_t i=0; i<cur; i++) {
|
||||||
b->writeUnibusByte(p++, xfer_buffer[i]);
|
b->writeUnibusByte(p++, xfer_buffer[i]);
|
||||||
|
|
||||||
if ((v & 2048) == 0)
|
if ((v & 2048) == 0)
|
||||||
update_bus_address(2);
|
update_bus_address(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
temp_reclen -= cur;
|
temp_reclen -= cur;
|
||||||
|
|
||||||
if (++sector >= 12) {
|
if (++sector >= 12) {
|
||||||
sector = 0;
|
sector = 0;
|
||||||
|
|
||||||
if (++surface >= 2) {
|
if (++surface >= 2) {
|
||||||
surface = 0;
|
surface = 0;
|
||||||
cylinder++;
|
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;
|
*disk_read_acitivity = false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue