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 NSECT = 22; // sectors per track
|
||||||
constexpr const unsigned NTRAC = 19; // tracks per cylinder
|
constexpr const unsigned NTRAC = 19; // tracks per cylinder
|
||||||
constexpr const unsigned SECTOR_SIZE = 512;
|
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) :
|
rp06::rp06(bus *const b, std::atomic_bool *const disk_read_activity, std::atomic_bool *const disk_write_activity) :
|
||||||
b(b),
|
b(b),
|
||||||
|
@ -38,6 +39,9 @@ void rp06::begin()
|
||||||
|
|
||||||
void rp06::reset()
|
void rp06::reset()
|
||||||
{
|
{
|
||||||
|
memset(registers, 0x00, sizeof registers);
|
||||||
|
|
||||||
|
registers[reg_num(RP06_DS)] = default_DS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rp06::show_state(console *const cnsl) const
|
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);
|
const int reg = reg_num(addr);
|
||||||
uint16_t value = registers[reg];
|
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);
|
TRACE("RP06: read \"%s\"/%o: %06o", regnames[reg], addr, value);
|
||||||
printf("RP06: read \"%s\"/%o: %06o\r\n", regnames[reg], addr, value);
|
|
||||||
|
|
||||||
return 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)];
|
uint16_t vtemp = registers[reg_num(addr)];
|
||||||
|
|
||||||
if (addr & 1) {
|
if (addr & 1) {
|
||||||
vtemp &= ~0xff00;
|
vtemp &= 0x00ff;
|
||||||
vtemp |= v << 8;
|
vtemp |= v << 8;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
vtemp &= ~0x00ff;
|
vtemp &= 0xff00;
|
||||||
vtemp |= v;
|
vtemp |= v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,8 +175,7 @@ void rp06::write_word(const uint16_t addr, uint16_t v)
|
||||||
|
|
||||||
generate_interrupt = true;
|
generate_interrupt = true;
|
||||||
}
|
}
|
||||||
|
else if (function_code == 070) { // READ
|
||||||
if (function_code == 070) { // READ
|
|
||||||
uint32_t offs = compute_offset();
|
uint32_t offs = compute_offset();
|
||||||
uint32_t addr = getphysaddr();
|
uint32_t addr = getphysaddr();
|
||||||
|
|
||||||
|
|
1
rp06.h
1
rp06.h
|
@ -22,6 +22,7 @@
|
||||||
#define RP06_DA 0176706 // desired address
|
#define RP06_DA 0176706 // desired address
|
||||||
#define RP06_CS2 0176710 // control/status register 2
|
#define RP06_CS2 0176710 // control/status register 2
|
||||||
#define RP06_DS 0176712 // drive status
|
#define RP06_DS 0176712 // drive status
|
||||||
|
#define RP06_ERRREG1 0176714 // error register 1
|
||||||
#define RP06_AS 0176716 // unified attention status
|
#define RP06_AS 0176716 // unified attention status
|
||||||
#define RP06_RMLA 0176720 // lookahead (sector under head!!)
|
#define RP06_RMLA 0176720 // lookahead (sector under head!!)
|
||||||
#define RP06_OFR 0176732 // heads offset
|
#define RP06_OFR 0176732 // heads offset
|
||||||
|
|
Loading…
Add table
Reference in a new issue