MMR0
This commit is contained in:
parent
a90547c3d1
commit
87e181a8e2
1 changed files with 22 additions and 10 deletions
32
bus.cpp
32
bus.cpp
|
@ -332,23 +332,35 @@ uint32_t bus::calculate_physical_address(const int run_mode, const uint16_t a, c
|
||||||
m_offset += p_offset;
|
m_offset += p_offset;
|
||||||
|
|
||||||
if (trap_on_failure) {
|
if (trap_on_failure) {
|
||||||
int access_control = pages[run_mode][0][apf].pdr & 7;
|
if (MMR0 & (1 << 9)) {
|
||||||
|
int access_control = pages[run_mode][0][apf].pdr & 7;
|
||||||
|
|
||||||
if (is_write && access_control != 6) { // write
|
if (is_write && access_control != 6) { // write
|
||||||
c->schedule_trap(04); // invalid address
|
|
||||||
|
|
||||||
pages[run_mode][0][apf].pdr |= 1 << 7; // TODO: D/I
|
|
||||||
|
|
||||||
throw 1;
|
|
||||||
}
|
|
||||||
else if (!is_write) { // read
|
|
||||||
if (access_control == 0 || access_control == 1 || access_control == 3 || access_control == 4 || access_control == 7) {
|
|
||||||
c->schedule_trap(04); // invalid address
|
c->schedule_trap(04); // invalid address
|
||||||
|
|
||||||
pages[run_mode][0][apf].pdr |= 1 << 7; // TODO: D/I
|
pages[run_mode][0][apf].pdr |= 1 << 7; // TODO: D/I
|
||||||
|
|
||||||
|
MMR0 |= 1 << 12;
|
||||||
|
|
||||||
|
MMR0 &= ~(3 << 5);
|
||||||
|
MMR0 |= run_mode << 5; // TODO: kernel-mode or user-mode when a trap occurs in user-mode?
|
||||||
|
|
||||||
throw 1;
|
throw 1;
|
||||||
}
|
}
|
||||||
|
else if (!is_write) { // read
|
||||||
|
if (access_control == 0 || access_control == 1 || access_control == 3 || access_control == 4 || access_control == 7) {
|
||||||
|
c->schedule_trap(04); // invalid address
|
||||||
|
|
||||||
|
pages[run_mode][0][apf].pdr |= 1 << 7; // TODO: D/I
|
||||||
|
|
||||||
|
MMR0 |= 1 << 12;
|
||||||
|
|
||||||
|
MMR0 &= ~(3 << 5);
|
||||||
|
MMR0 |= run_mode << 5;
|
||||||
|
|
||||||
|
throw 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t pdr_len = (((pages[run_mode][0][apf].pdr >> 8) & 127) + 1) * 64; // TODO: D/I
|
uint16_t pdr_len = (((pages[run_mode][0][apf].pdr >> 8) & 127) + 1) * 64; // TODO: D/I
|
||||||
|
|
Loading…
Add table
Reference in a new issue