RP06: wip

This commit is contained in:
folkert van heusden 2024-06-13 09:44:27 +02:00
parent 90f0b61a77
commit e291d2d163
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
2 changed files with 15 additions and 7 deletions

View file

@ -17,8 +17,9 @@
constexpr const unsigned NSECT = 22; // sectors per track
constexpr const unsigned NTRAC = 19; // tracks per cylinder
constexpr const unsigned SECTOR_SIZE = 512;
constexpr const uint16_t default_DS = 0400 /* drive present */ | 010000 /* medium on-line */ | 0100 /* volume valid */ | 0200 /* drive ready */;
constexpr const char *regnames[] { "Control", "Status", "Error register 1", "Maintenance", "Attention summary", "Desired sector/track address", "Look ahead", "Drive type", "Serial no", "Offset", "Desired cylinder address", "Current cylinder address", "Error register 2", "Error register 3", "ECC position", "ECC pattern" };
constexpr const char *regnames[] { "Control", "Status", "Error register 1", "Maintenance", "Attention summary", "Desired sector/track address", "Error register 1", "Look ahead", "Drive type", "Serial no", "Offset", "Desired cylinder address", "Current cylinder address", "Error register 2", "Error register 3", "ECC position", "ECC pattern" };
rp06::rp06(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity) :
b(b),
@ -38,6 +39,9 @@ void rp06::begin()
void rp06::reset()
{
memset(registers, 0x00, sizeof registers);
registers[reg_num(RP06_DS)] = default_DS;
}
void rp06::show_state(console *const cnsl) const
@ -74,8 +78,12 @@ uint16_t rp06::read_word(const uint16_t addr)
const int reg = reg_num(addr);
uint16_t value = registers[reg];
if (addr == RP06_CS1)
value |= 0200 /* ready */;
else if (addr == RP06_DS)
value |= 0400 /* drive present */ | 010000 /* medium on-line */ | 0100 /* volume valid */ | 0200 /* drive ready */;
TRACE("RP06: read \"%s\"/%o: %06o", regnames[reg], addr, value);
printf("RP06: read \"%s\"/%o: %06o\r\n", regnames[reg], addr, value);
return value;
}
@ -90,11 +98,11 @@ void rp06::write_byte(const uint16_t addr, const uint8_t v)
uint16_t vtemp = registers[reg_num(addr)];
if (addr & 1) {
vtemp &= ~0xff00;
vtemp &= 0x00ff;
vtemp |= v << 8;
}
else {
vtemp &= ~0x00ff;
vtemp &= 0xff00;
vtemp |= v;
}
@ -167,8 +175,7 @@ void rp06::write_word(const uint16_t addr, uint16_t v)
generate_interrupt = true;
}
if (function_code == 070) { // READ
else if (function_code == 070) { // READ
uint32_t offs = compute_offset();
uint32_t addr = getphysaddr();
@ -192,7 +199,7 @@ void rp06::write_word(const uint16_t addr, uint16_t v)
b->writeUnibusByte(addr++, xfer_buffer[i]);
}
registers[reg_num(RP06_WC)] = 0;
registers[reg_num(RP06_WC)] = 0;
registers[reg_num(RP06_CS1)] |= 0200; // drive ready
generate_interrupt = true;

1
rp06.h
View file

@ -22,6 +22,7 @@
#define RP06_DA 0176706 // desired address
#define RP06_CS2 0176710 // control/status register 2
#define RP06_DS 0176712 // drive status
#define RP06_ERRREG1 0176714 // error register 1
#define RP06_AS 0176716 // unified attention status
#define RP06_RMLA 0176720 // lookahead (sector under head!!)
#define RP06_OFR 0176732 // heads offset