nemu/src/instructions/shift.c

68 lines
1.8 KiB
C

#include <instructions/instructions.h>
void instruction_roctl_r(cpu_status_t* status){
long temp;
if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x80000000) == 0)
temp = 0;
else
temp = 1;
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] <<= 1;
if (status->t == 1)
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] |= 0x00000001;
else
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0xFFFFFFFE;
if (temp == 1)
status->t = 1;
else
status->t = 0;
status->pc += 2;
}
void instruction_shar_r(cpu_status_t* status){
long temp;
if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x00000001) == 0)
status->t = 0;
else
status->t = 1;
if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x80000000) == 0)
temp = 0;
else
temp = 1;
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >>= 1;
if (temp == 1)
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] |= 0x80000000;
else
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x7FFFFFFF;
status->pc += 2;
}
void instruction_shll2_r(cpu_status_t* status){
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] <<= 2;
status->pc += 2;
}
void instruction_shlr_r(cpu_status_t* status){
if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x00000001) == 0)
status->t = 0;
else
status->t = 1;
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >>= 1;
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x7FFFFFFF;
status->pc += 2;
}
void instruction_shlr2_r(cpu_status_t* status){
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >>= 2;
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x3FFFFFFF;
status->pc += 2;
}