mirror of
https://github.com/dingusdev/dingusppc.git
synced 2024-11-04 20:06:35 +00:00
ppcopcodes: fix lswi/stswi emulation.
This commit is contained in:
parent
477ad7ddee
commit
123f820775
@ -1947,40 +1947,32 @@ void dppc_interpreter::ppc_lswi() {
|
||||
#endif
|
||||
ppc_grab_regsda();
|
||||
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;
|
||||
uint32_t stringed_word = 0;
|
||||
|
||||
while (grab_inb > 0) {
|
||||
switch (grab_inb) {
|
||||
case 1:
|
||||
stringed_word = 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;
|
||||
ppc_state.gpr[reg_d] = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24;
|
||||
grab_inb = 0;
|
||||
break;
|
||||
case 2:
|
||||
stringed_word = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24;
|
||||
//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;
|
||||
ppc_state.gpr[reg_d] = mmu_read_vmem<uint16_t>(ppc_effective_address) << 16;
|
||||
grab_inb = 0;
|
||||
break;
|
||||
case 3:
|
||||
stringed_word = mmu_read_vmem<uint8_t>(ppc_effective_address) << 24;
|
||||
//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;
|
||||
stringed_word = mmu_read_vmem<uint16_t>(ppc_effective_address) << 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;
|
||||
grab_inb = 0;
|
||||
break;
|
||||
default:
|
||||
//ppc_state.gpr[reg_d] = mem_grab_word(ppc_effective_address);
|
||||
ppc_state.gpr[reg_d] = mmu_read_vmem<uint16_t>(ppc_effective_address);
|
||||
ppc_state.gpr[reg_d] = mmu_read_vmem<uint32_t>(ppc_effective_address);
|
||||
reg_d++;
|
||||
if (reg_d >= 32) { // wrap around through GPR0
|
||||
reg_d = 0;
|
||||
}
|
||||
ppc_effective_address += 4;
|
||||
grab_inb -= 4;
|
||||
}
|
||||
@ -2036,36 +2028,30 @@ void dppc_interpreter::ppc_stswi() {
|
||||
#endif
|
||||
ppc_grab_regssa();
|
||||
ppc_effective_address = reg_a ? ppc_result_a : 0;
|
||||
grab_inb = (ppc_cur_instruction >> 11) & 31;
|
||||
grab_inb = (grab_inb & 32) == 0 ? 32 : grab_inb;
|
||||
grab_inb = (ppc_cur_instruction >> 11) & 0x1F;
|
||||
grab_inb = grab_inb ? grab_inb : 32;
|
||||
|
||||
while (grab_inb > 0) {
|
||||
switch (grab_inb) {
|
||||
case 1:
|
||||
mmu_write_vmem<uint8_t>(ppc_effective_address, (ppc_result_d >> 24));
|
||||
//mem_write_byte(ppc_effective_address, (ppc_result_d >> 24));
|
||||
mmu_write_vmem<uint8_t>(ppc_effective_address, ppc_state.gpr[reg_s] >> 24);
|
||||
grab_inb = 0;
|
||||
break;
|
||||
case 2:
|
||||
mmu_write_vmem<uint8_t>(ppc_effective_address, ((ppc_result_d >> 24) & 0xFF));
|
||||
//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));
|
||||
mmu_write_vmem<uint16_t>(ppc_effective_address, ppc_state.gpr[reg_s] >> 16);
|
||||
grab_inb = 0;
|
||||
break;
|
||||
case 3:
|
||||
mmu_write_vmem<uint8_t>(ppc_effective_address, ((ppc_result_d >> 24) & 0xFF));
|
||||
//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));
|
||||
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));
|
||||
mmu_write_vmem<uint16_t>(ppc_effective_address, ppc_state.gpr[reg_s] >> 16);
|
||||
mmu_write_vmem<uint8_t>(ppc_effective_address + 2, (ppc_state.gpr[reg_s] >> 8) & 0xFF);
|
||||
grab_inb = 0;
|
||||
break;
|
||||
default:
|
||||
mmu_write_vmem<uint32_t>(ppc_effective_address, ppc_result_d);
|
||||
//mem_write_dword(ppc_effective_address, ppc_result_d);
|
||||
mmu_write_vmem<uint32_t>(ppc_effective_address, ppc_state.gpr[reg_s]);
|
||||
reg_s++;
|
||||
if (reg_s >= 32) { // wrap around through GPR0
|
||||
reg_s = 0;
|
||||
}
|
||||
ppc_effective_address += 4;
|
||||
grab_inb -= 4;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user