use d-space where required
This commit is contained in:
parent
be68ad2357
commit
a935fe44d7
3 changed files with 17 additions and 9 deletions
5
bus.cpp
5
bus.cpp
|
@ -464,6 +464,11 @@ void bus::check_address(const bool trap_on_failure, const bool is_write, const m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool bus::get_use_data_space(const int run_mode)
|
||||||
|
{
|
||||||
|
return !!(MMR3 & di_ena_mask[run_mode]);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t bus::calculate_physical_address(const int run_mode, const uint16_t a, const bool trap_on_failure, const bool is_write, const bool peek_only, const bool is_data)
|
uint32_t bus::calculate_physical_address(const int run_mode, const uint16_t a, const bool trap_on_failure, const bool is_write, const bool peek_only, const bool is_data)
|
||||||
{
|
{
|
||||||
uint32_t m_offset = a;
|
uint32_t m_offset = a;
|
||||||
|
|
1
bus.h
1
bus.h
|
@ -150,6 +150,7 @@ public:
|
||||||
|
|
||||||
uint32_t calculate_physical_address(const int run_mode, const uint16_t a, const bool trap_on_failure, const bool is_write, const bool peek_only, const bool is_data);
|
uint32_t calculate_physical_address(const int run_mode, const uint16_t a, const bool trap_on_failure, const bool is_write, const bool peek_only, const bool is_data);
|
||||||
|
|
||||||
|
bool get_use_data_space(const int run_mode);
|
||||||
memory_addresses_t calculate_physical_address(const int run_mode, const uint16_t a);
|
memory_addresses_t calculate_physical_address(const int run_mode, const uint16_t a);
|
||||||
void check_address(const bool trap_on_failure, const bool is_write, const memory_addresses_t & addr, const bool word_mode, const bool is_data, const int run_mode);
|
void check_address(const bool trap_on_failure, const bool is_write, const memory_addresses_t & addr, const bool word_mode, const bool is_data, const int run_mode);
|
||||||
};
|
};
|
||||||
|
|
20
cpu.cpp
20
cpu.cpp
|
@ -331,6 +331,8 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode
|
||||||
|
|
||||||
uint16_t next_word = 0;
|
uint16_t next_word = 0;
|
||||||
|
|
||||||
|
d_i_space_t space = reg == 7 ? i_space : (b->get_use_data_space(psw >> 14) ? d_space : i_space);
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case 0: // 000
|
case 0: // 000
|
||||||
g.reg = reg;
|
g.reg = reg;
|
||||||
|
@ -339,45 +341,45 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const bool word_mode
|
||||||
case 1:
|
case 1:
|
||||||
g.addr = getRegister(reg, g.set, prev_mode);
|
g.addr = getRegister(reg, g.set, prev_mode);
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, space);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
g.addr = getRegister(reg, g.set, prev_mode);
|
g.addr = getRegister(reg, g.set, prev_mode);
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, space);
|
||||||
addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? 2 : 1);
|
addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? 2 : 1);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode);
|
g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, space);
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space);
|
||||||
addRegister(reg, prev_mode, 2);
|
addRegister(reg, prev_mode, 2);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? -2 : -1);
|
addRegister(reg, prev_mode, !word_mode || reg == 7 || reg == 6 ? -2 : -1);
|
||||||
g.addr = getRegister(reg, g.set, prev_mode);
|
g.addr = getRegister(reg, g.set, prev_mode);
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, false, d_space);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
addRegister(reg, prev_mode, -2);
|
addRegister(reg, prev_mode, -2);
|
||||||
g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode);
|
g.addr = b->read(getRegister(reg, g.set, prev_mode), false, prev_mode, space);
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
next_word = b -> read(getPC(), false, prev_mode);
|
next_word = b -> read(getPC(), false, prev_mode);
|
||||||
addRegister(7, prev_mode, + 2);
|
addRegister(7, prev_mode, + 2);
|
||||||
g.addr = getRegister(reg, g.set, prev_mode) + next_word;
|
g.addr = getRegister(reg, g.set, prev_mode) + next_word;
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space);
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
next_word = b -> read(getPC(), false, prev_mode);
|
next_word = b -> read(getPC(), false, prev_mode);
|
||||||
addRegister(7, prev_mode, + 2);
|
addRegister(7, prev_mode, + 2);
|
||||||
g.addr = b->read(getRegister(reg, g.set, prev_mode) + next_word, false, prev_mode);
|
g.addr = b->read(getRegister(reg, g.set, prev_mode) + next_word, false, prev_mode);
|
||||||
if (read_value)
|
if (read_value)
|
||||||
g.value = b->read(g.addr.value(), word_mode, prev_mode);
|
g.value = b->read(g.addr.value(), word_mode, prev_mode, d_space);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue