ppcopcodes: fix lswi/stswi emulation.

This commit is contained in:
Maxim Poliakovski 2022-02-19 23:21:18 +01:00
parent 477ad7ddee
commit 123f820775

View File

@ -1946,41 +1946,33 @@ void dppc_interpreter::ppc_lswi() {
num_int_loads++; num_int_loads++;
#endif #endif
ppc_grab_regsda(); ppc_grab_regsda();
ppc_effective_address = reg_a ? ppc_result_a : 0; ppc_effective_address = reg_a ? ppc_result_a : 0;
grab_inb = (ppc_cur_instruction >> 11) & 31; grab_inb = (ppc_cur_instruction >> 11) & 0x1F;
grab_inb = grab_inb ? grab_inb : 32; grab_inb = grab_inb ? grab_inb : 32;
uint32_t stringed_word = 0; uint32_t stringed_word = 0;
while (grab_inb > 0) { while (grab_inb > 0) {
switch (grab_inb) { switch (grab_inb) {
case 1: case 1:
stringed_word = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24; ppc_state.gpr[reg_d] = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24;
//stringed_word = mem_grab_byte(ppc_effective_address) << 24;
ppc_state.gpr[reg_d] = stringed_word;
grab_inb = 0; grab_inb = 0;
break; break;
case 2: case 2:
stringed_word = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24; ppc_state.gpr[reg_d] = mmu_read_vmem<uint16_t>(ppc_effective_address) << 16;
//stringed_word = mem_grab_byte(ppc_effective_address) << 24;
stringed_word += mmu_read_vmem<uint8_t>(ppc_effective_address + 1) << 16;
//stringed_word += mem_grab_byte(ppc_effective_address + 1) << 16;
ppc_state.gpr[reg_d] = stringed_word;
grab_inb = 0; grab_inb = 0;
break; break;
case 3: case 3:
stringed_word = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24; stringed_word = mmu_read_vmem<uint16_t>(ppc_effective_address) << 16;
//stringed_word = mem_grab_byte(ppc_effective_address) << 24; stringed_word += mmu_read_vmem<uint8_t>(ppc_effective_address + 2) << 8;
stringed_word += mmu_read_vmem<uint8_t>(ppc_effective_address + 1) << 16;
//stringed_word += mem_grab_byte(ppc_effective_address + 1) << 16;
stringed_word += mmu_read_vmem<uint8_t>(ppc_effective_address + 2) << 8;
//stringed_word += mem_grab_byte(ppc_effective_address + 2) << 8;
ppc_state.gpr[reg_d] = stringed_word; ppc_state.gpr[reg_d] = stringed_word;
grab_inb = 0; grab_inb = 0;
break; break;
default: default:
//ppc_state.gpr[reg_d] = mem_grab_word(ppc_effective_address); ppc_state.gpr[reg_d] = mmu_read_vmem<uint32_t>(ppc_effective_address);
ppc_state.gpr[reg_d] = mmu_read_vmem<uint16_t>(ppc_effective_address);
reg_d++; reg_d++;
if (reg_d >= 32) { // wrap around through GPR0
reg_d = 0;
}
ppc_effective_address += 4; ppc_effective_address += 4;
grab_inb -= 4; grab_inb -= 4;
} }
@ -2035,37 +2027,31 @@ void dppc_interpreter::ppc_stswi() {
num_int_stores++; num_int_stores++;
#endif #endif
ppc_grab_regssa(); ppc_grab_regssa();
ppc_effective_address = reg_a ? ppc_result_a : 0; ppc_effective_address = reg_a ? ppc_result_a : 0;
grab_inb = (ppc_cur_instruction >> 11) & 31; grab_inb = (ppc_cur_instruction >> 11) & 0x1F;
grab_inb = (grab_inb & 32) == 0 ? 32 : grab_inb; grab_inb = grab_inb ? grab_inb : 32;
while (grab_inb > 0) { while (grab_inb > 0) {
switch (grab_inb) { switch (grab_inb) {
case 1: case 1:
mmu_write_vmem<uint8_t>(ppc_effective_address, (ppc_result_d >> 24)); mmu_write_vmem<uint8_t>(ppc_effective_address, ppc_state.gpr[reg_s] >> 24);
//mem_write_byte(ppc_effective_address, (ppc_result_d >> 24));
grab_inb = 0; grab_inb = 0;
break; break;
case 2: case 2:
mmu_write_vmem<uint8_t>(ppc_effective_address, ((ppc_result_d >> 24) & 0xFF)); mmu_write_vmem<uint16_t>(ppc_effective_address, ppc_state.gpr[reg_s] >> 16);
//mem_write_byte(ppc_effective_address, ((ppc_result_d >> 24) & 0xFF));
mmu_write_vmem<uint8_t>((ppc_effective_address + 1), ((ppc_result_d >> 16) & 0xFF));
//mem_write_byte((ppc_effective_address + 1), ((ppc_result_d >> 16) & 0xFF));
grab_inb = 0; grab_inb = 0;
break; break;
case 3: case 3:
mmu_write_vmem<uint8_t>(ppc_effective_address, ((ppc_result_d >> 24) & 0xFF)); mmu_write_vmem<uint16_t>(ppc_effective_address, ppc_state.gpr[reg_s] >> 16);
//mem_write_byte(ppc_effective_address, ((ppc_result_d >> 24) & 0xFF)); mmu_write_vmem<uint8_t>(ppc_effective_address + 2, (ppc_state.gpr[reg_s] >> 8) & 0xFF);
mmu_write_vmem<uint8_t>((ppc_effective_address + 1), ((ppc_result_d >> 16) & 0xFF));
//mem_write_byte((ppc_effective_address + 1), ((ppc_result_d >> 16) & 0xFF));
mmu_write_vmem<uint8_t>((ppc_effective_address + 2), ((ppc_result_d >> 8) & 0xFF));
//mem_write_byte((ppc_effective_address + 2), ((ppc_result_d >> 8) & 0xFF));
grab_inb = 0; grab_inb = 0;
break; break;
default: default:
mmu_write_vmem<uint32_t>(ppc_effective_address, ppc_result_d); mmu_write_vmem<uint32_t>(ppc_effective_address, ppc_state.gpr[reg_s]);
//mem_write_dword(ppc_effective_address, ppc_result_d);
reg_s++; reg_s++;
if (reg_s >= 32) { // wrap around through GPR0
reg_s = 0;
}
ppc_effective_address += 4; ppc_effective_address += 4;
grab_inb -= 4; grab_inb -= 4;
} }