removed variable from get/set_register

This commit is contained in:
folkert van heusden 2024-06-24 09:35:04 +02:00
parent bd1228bbf8
commit a4f753915c
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
2 changed files with 34 additions and 28 deletions

56
cpu.cpp
View file

@ -143,7 +143,7 @@ void cpu::reset()
init_interrupt_queue(); init_interrupt_queue();
} }
uint16_t cpu::get_register(const int nr, const rm_selection_t mode_selection) const uint16_t cpu::get_register(const int nr) const
{ {
if (nr < 6) { if (nr < 6) {
int set = get_register_set(); int set = get_register_set();
@ -151,31 +151,23 @@ uint16_t cpu::get_register(const int nr, const rm_selection_t mode_selection) co
return regs0_5[set][nr]; return regs0_5[set][nr];
} }
if (nr == 6) { if (nr == 6)
if (mode_selection == rm_prev)
return sp[getPSW_prev_runmode()];
return sp[getPSW_runmode()]; return sp[getPSW_runmode()];
}
assert(nr == 7); assert(nr == 7);
return pc; return pc;
} }
void cpu::set_register(const int nr, const uint16_t value, const rm_selection_t mode_selection) void cpu::set_register(const int nr, const uint16_t value)
{ {
if (nr < 6) { if (nr < 6) {
int set = get_register_set(); int set = get_register_set();
regs0_5[set][nr] = value; regs0_5[set][nr] = value;
} }
else if (nr == 6) { else if (nr == 6)
if (mode_selection == rm_prev)
sp[getPSW_prev_runmode()] = value;
else
sp[getPSW_runmode()] = value; sp[getPSW_runmode()] = value;
}
else { else {
assert(nr == 7); assert(nr == 7);
pc = value; pc = value;
@ -491,22 +483,22 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const word_mode_t wo
switch(mode) { switch(mode) {
case 0: // Rn case 0: // Rn
g.reg = reg; g.reg = reg;
g.value = get_register(reg, rm_cur) & (word_mode == wm_byte ? 0xff : 0xffff); g.value = get_register(reg) & (word_mode == wm_byte ? 0xff : 0xffff);
break; break;
case 1: // (Rn) case 1: // (Rn)
g.addr = get_register(reg, rm_cur); g.addr = get_register(reg);
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, rm_cur, isR7_space); g.value = b->read(g.addr.value(), word_mode, rm_cur, isR7_space);
break; break;
case 2: // (Rn)+ / #n case 2: // (Rn)+ / #n
g.addr = get_register(reg, rm_cur); g.addr = get_register(reg);
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, rm_cur, isR7_space); g.value = b->read(g.addr.value(), word_mode, rm_cur, isR7_space);
addRegister(reg, rm_cur, word_mode == wm_word || reg == 7 || reg == 6 ? 2 : 1); addRegister(reg, rm_cur, word_mode == wm_word || reg == 7 || reg == 6 ? 2 : 1);
g.mmr1_update = { word_mode == wm_word || reg == 7 || reg == 6 ? 2 : 1, reg }; g.mmr1_update = { word_mode == wm_word || reg == 7 || reg == 6 ? 2 : 1, reg };
break; break;
case 3: // @(Rn)+ / @#a case 3: // @(Rn)+ / @#a
g.addr = b->read(get_register(reg, rm_cur), wm_word, rm_cur, isR7_space); g.addr = b->read(get_register(reg), wm_word, rm_cur, isR7_space);
// might be wrong: the adds should happen when the read is really performed, because of traps // might be wrong: the adds should happen when the read is really performed, because of traps
addRegister(reg, rm_cur, 2); addRegister(reg, rm_cur, 2);
g.mmr1_update = { 2, reg }; g.mmr1_update = { 2, reg };
@ -518,14 +510,14 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const word_mode_t wo
addRegister(reg, rm_cur, word_mode == wm_word || reg == 7 || reg == 6 ? -2 : -1); addRegister(reg, rm_cur, word_mode == wm_word || reg == 7 || reg == 6 ? -2 : -1);
g.mmr1_update = { word_mode == wm_word || reg == 7 || reg == 6 ? -2 : -1, reg }; g.mmr1_update = { word_mode == wm_word || reg == 7 || reg == 6 ? -2 : -1, reg };
g.space = d_space; g.space = d_space;
g.addr = get_register(reg, rm_cur); g.addr = get_register(reg);
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, rm_cur, isR7_space); g.value = b->read(g.addr.value(), word_mode, rm_cur, isR7_space);
break; break;
case 5: // @-(Rn) case 5: // @-(Rn)
addRegister(reg, rm_cur, -2); addRegister(reg, rm_cur, -2);
g.mmr1_update = { -2, reg }; g.mmr1_update = { -2, reg };
g.addr = b->read(get_register(reg, rm_cur), wm_word, rm_cur, isR7_space); g.addr = b->read(get_register(reg), wm_word, rm_cur, isR7_space);
g.space = d_space; g.space = d_space;
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, rm_cur, g.space); g.value = b->read(g.addr.value(), word_mode, rm_cur, g.space);
@ -533,7 +525,7 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const word_mode_t wo
case 6: // x(Rn) / a case 6: // x(Rn) / a
next_word = b->read(getPC(), wm_word, rm_cur, i_space); next_word = b->read(getPC(), wm_word, rm_cur, i_space);
addRegister(7, rm_cur, + 2); addRegister(7, rm_cur, + 2);
g.addr = get_register(reg, rm_cur) + next_word; g.addr = get_register(reg) + next_word;
g.space = d_space; g.space = d_space;
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, rm_cur, g.space); g.value = b->read(g.addr.value(), word_mode, rm_cur, g.space);
@ -541,7 +533,7 @@ gam_rc_t cpu::getGAM(const uint8_t mode, const uint8_t reg, const word_mode_t wo
case 7: // @x(Rn) / @a case 7: // @x(Rn) / @a
next_word = b->read(getPC(), wm_word, rm_cur, i_space); next_word = b->read(getPC(), wm_word, rm_cur, i_space);
addRegister(7, rm_cur, + 2); addRegister(7, rm_cur, + 2);
g.addr = b->read(get_register(reg, rm_cur) + next_word, wm_word, rm_cur, d_space); g.addr = b->read(get_register(reg) + next_word, wm_word, rm_cur, d_space);
g.space = d_space; g.space = d_space;
if (read_value) if (read_value)
g.value = b->read(g.addr.value(), word_mode, rm_cur, g.space); g.value = b->read(g.addr.value(), word_mode, rm_cur, g.space);
@ -563,7 +555,13 @@ bool cpu::putGAM(const gam_rc_t & g, const uint16_t value)
return rc.is_psw == false; return rc.is_psw == false;
} }
set_register(g.reg.value(), value, g.mode_selection); if (g.mode_selection == rm_prev) {
assert(g.reg.value() == 6);
sp[getPSW_prev_runmode()] = value;
}
else {
set_register(g.reg.value(), value);
}
return true; return true;
} }
@ -1419,8 +1417,12 @@ bool cpu::single_operand_instructions(const uint16_t instr)
// always words: word_mode-bit is to select between MFPI and MFPD // always words: word_mode-bit is to select between MFPI and MFPD
uint16_t v = 0xffff; uint16_t v = 0xffff;
if (dst_mode == 0) if (dst_mode == 0) {
v = get_register(dst_reg, rm_prev); if (dst_reg == 6)
v = sp[getPSW_prev_runmode()];
else
v = get_register(dst_reg);
}
else { else {
// calculate address in current address space // calculate address in current address space
auto a = getGAMAddress(dst_mode, dst_reg, wm_word); auto a = getGAMAddress(dst_mode, dst_reg, wm_word);
@ -1444,8 +1446,12 @@ bool cpu::single_operand_instructions(const uint16_t instr)
uint16_t v = popStack(); uint16_t v = popStack();
bool set_flags = true; bool set_flags = true;
if (dst_mode == 0) if (dst_mode == 0) {
set_register(dst_reg, v, rm_prev); if (dst_reg == 6)
sp[getPSW_prev_runmode()] = v;
else
set_register(dst_reg, v);
}
else { else {
auto a = getGAMAddress(dst_mode, dst_reg, wm_word); auto a = getGAMAddress(dst_mode, dst_reg, wm_word);
addToMMR1(a); addToMMR1(a);

4
cpu.h
View file

@ -181,7 +181,7 @@ public:
uint16_t getStackPointer(const int which) const { assert(which >= 0 && which < 4); return sp[which]; } uint16_t getStackPointer(const int which) const { assert(which >= 0 && which < 4); return sp[which]; }
uint16_t getPC() const { return pc; } uint16_t getPC() const { return pc; }
void set_register(const int nr, const uint16_t value, const rm_selection_t mode_selection = rm_cur); void set_register(const int nr, const uint16_t value);
void set_registerLowByte(const int nr, const word_mode_t word_mode, const uint16_t value); void set_registerLowByte(const int nr, const word_mode_t word_mode, const uint16_t value);
// used by 'main' for json-validation // used by 'main' for json-validation
void lowlevel_register_set(const uint8_t set, const uint8_t reg, const uint16_t value); void lowlevel_register_set(const uint8_t set, const uint8_t reg, const uint16_t value);
@ -193,7 +193,7 @@ public:
void setStackPointer(const int which, const uint16_t value) { assert(which >= 0 && which < 4); sp[which] = value; } void setStackPointer(const int which, const uint16_t value) { assert(which >= 0 && which < 4); sp[which] = value; }
void setPC(const uint16_t value) { pc = value; } void setPC(const uint16_t value) { pc = value; }
uint16_t get_register(const int nr, const rm_selection_t mode_selection = rm_cur) const; uint16_t get_register(const int nr) const;
bool put_result(const gam_rc_t & g, const uint16_t value); bool put_result(const gam_rc_t & g, const uint16_t value);
}; };