RP06: wip
This commit is contained in:
parent
90f0b61a77
commit
e291d2d163
2 changed files with 15 additions and 7 deletions
19
rp06.cpp
19
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();
|
||||
|
||||
|
|
1
rp06.h
1
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
|
||||
|
|
Loading…
Add table
Reference in a new issue