write rl02 (required for unix 7 to boot)
This commit is contained in:
parent
056681e32f
commit
9c75d94d70
1 changed files with 46 additions and 10 deletions
56
rl02.cpp
56
rl02.cpp
|
@ -13,7 +13,6 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
bool flag = false;
|
|
||||||
static const char * const regnames[] = {
|
static const char * const regnames[] = {
|
||||||
"control status",
|
"control status",
|
||||||
"bus address",
|
"bus address",
|
||||||
|
@ -180,9 +179,6 @@ void rl02::writeWord(const uint16_t addr, uint16_t v)
|
||||||
}
|
}
|
||||||
else if (command == 4) { // read header
|
else if (command == 4) { // read header
|
||||||
mpr[0] = (sector & 63) | (head << 6) | (track << 7);
|
mpr[0] = (sector & 63) | (head << 6) | (track << 7);
|
||||||
DOLOG(ll_error, true, "GREP3 %06o", mpr[0]);
|
|
||||||
if (mpr[0] == 032606)
|
|
||||||
flag = true;
|
|
||||||
mpr[1] = 0; // zero
|
mpr[1] = 0; // zero
|
||||||
mpr[2] = 0; // TODO: CRC
|
mpr[2] = 0; // TODO: CRC
|
||||||
|
|
||||||
|
@ -190,6 +186,52 @@ void rl02::writeWord(const uint16_t addr, uint16_t v)
|
||||||
|
|
||||||
do_int = true;
|
do_int = true;
|
||||||
}
|
}
|
||||||
|
else if (command == 5) { // write data
|
||||||
|
uint32_t memory_address = get_bus_address();
|
||||||
|
|
||||||
|
uint32_t count = (65536l - registers[(RL02_MPR - RL02_BASE) / 2]) * 2;
|
||||||
|
if (count == 65536)
|
||||||
|
count = 0;
|
||||||
|
|
||||||
|
uint16_t temp = registers[(RL02_DAR - RL02_BASE) / 2];
|
||||||
|
|
||||||
|
sector = temp & 63;
|
||||||
|
head = (temp >> 6) & 1;
|
||||||
|
track = temp >> 7;
|
||||||
|
|
||||||
|
uint32_t temp_disk_offset = calc_offset();
|
||||||
|
|
||||||
|
DOLOG(debug, false, "RL02 write %d bytes (dec) to %d (dec) from %06o (oct) [cylinder: %d, head: %d, sector: %d]", count, temp_disk_offset, memory_address, track, head, sector);
|
||||||
|
|
||||||
|
while(count > 0) {
|
||||||
|
uint32_t cur = std::min(uint32_t(sizeof xfer_buffer), count);
|
||||||
|
|
||||||
|
if (!fhs.at(device)->write(temp_disk_offset, cur, xfer_buffer)) {
|
||||||
|
DOLOG(ll_error, true, "RL02 write error, device %d, disk offset %u, read size %u, cylinder %d, head %d, sector %d", device, temp_disk_offset, cur, track, head, sector);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mpr[0] += count / 2;
|
||||||
|
|
||||||
|
temp_disk_offset += cur;
|
||||||
|
|
||||||
|
count -= cur;
|
||||||
|
|
||||||
|
sector++;
|
||||||
|
if (sector >= rl02_sectors_per_track) {
|
||||||
|
sector = 0;
|
||||||
|
|
||||||
|
head++;
|
||||||
|
if (head >= 2) {
|
||||||
|
head = 0;
|
||||||
|
|
||||||
|
track++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_int = true;
|
||||||
|
}
|
||||||
else if (command == 6 || command == 7) { // read data / read data without header check
|
else if (command == 6 || command == 7) { // read data / read data without header check
|
||||||
uint32_t memory_address = get_bus_address();
|
uint32_t memory_address = get_bus_address();
|
||||||
|
|
||||||
|
@ -198,7 +240,6 @@ void rl02::writeWord(const uint16_t addr, uint16_t v)
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
uint16_t temp = registers[(RL02_DAR - RL02_BASE) / 2];
|
uint16_t temp = registers[(RL02_DAR - RL02_BASE) / 2];
|
||||||
DOLOG(ll_error, true, "GREP2 %06o", temp);
|
|
||||||
|
|
||||||
sector = temp & 63;
|
sector = temp & 63;
|
||||||
head = (temp >> 6) & 1;
|
head = (temp >> 6) & 1;
|
||||||
|
@ -206,11 +247,6 @@ void rl02::writeWord(const uint16_t addr, uint16_t v)
|
||||||
|
|
||||||
uint32_t temp_disk_offset = calc_offset();
|
uint32_t temp_disk_offset = calc_offset();
|
||||||
|
|
||||||
DOLOG(ll_error, true, "GREP1 %02x", b->getMMR3() & 0x20);
|
|
||||||
|
|
||||||
if (flag)
|
|
||||||
printf("%06o\n", b->getCpu()->getPC());
|
|
||||||
|
|
||||||
DOLOG(debug, false, "RL02 read %d bytes (dec) from %d (dec) to %06o (oct) [cylinder: %d, head: %d, sector: %d]", count, temp_disk_offset, memory_address, track, head, sector);
|
DOLOG(debug, false, "RL02 read %d bytes (dec) from %d (dec) to %06o (oct) [cylinder: %d, head: %d, sector: %d]", count, temp_disk_offset, memory_address, track, head, sector);
|
||||||
|
|
||||||
// update_dar();
|
// update_dar();
|
||||||
|
|
Loading…
Add table
Reference in a new issue