diff --git a/rp06.cpp b/rp06.cpp index a9ccb12..1005e4b 100644 --- a/rp06.cpp +++ b/rp06.cpp @@ -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; diff --git a/rp06.h b/rp06.h index 724e1ae..f418714 100644 --- a/rp06.h +++ b/rp06.h @@ -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