getGAMAddress: reg 6/7 need special handling
This commit is contained in:
parent
3c81b4f9e8
commit
89435e48d6
1 changed files with 12 additions and 2 deletions
14
cpu.cpp
14
cpu.cpp
|
@ -418,11 +418,21 @@ uint16_t cpu::getGAMAddress(const uint8_t mode, const int reg, const bool word_m
|
||||||
uint16_t temp = 0;
|
uint16_t temp = 0;
|
||||||
|
|
||||||
int set = getBitPSW(11);
|
int set = getBitPSW(11);
|
||||||
|
int run_mode = psw >> 14;
|
||||||
|
|
||||||
|
constexpr uint16_t sp_pointers[] = { ADDR_KERNEL_SP, ADDR_SV_SP, 0xffff, ADDR_USER_SP };
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case 0:
|
case 0:
|
||||||
// registers are also mapped in memory
|
printf("REG: %d\r\n", reg);
|
||||||
return 0177700 + reg;
|
// registers are also mapped in memory
|
||||||
|
if (reg < 6)
|
||||||
|
return (run_mode == 3 ? ADDR_USER_R : ADDR_KERNEL_R) + reg;
|
||||||
|
|
||||||
|
if (reg == 7)
|
||||||
|
return ADDR_PC;
|
||||||
|
|
||||||
|
return sp_pointers[run_mode];
|
||||||
case 1:
|
case 1:
|
||||||
return getRegister(reg, set, prev_mode);
|
return getRegister(reg, set, prev_mode);
|
||||||
case 2:
|
case 2:
|
||||||
|
|
Loading…
Add table
Reference in a new issue