nemu/src/instructions/mov.c

35 lines
1.2 KiB
C
Raw Normal View History

2022-07-05 19:20:34 +02:00
#include <cpu.h>
#include <instructions/instructions.h>
void instruction_mov_r_r(cpu_status_t* status) {
2022-07-11 09:21:36 +02:00
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))];
2022-07-05 19:20:34 +02:00
status->pc += 2;
}
void instruction_mov_imm_r(cpu_status_t* status){
if ((cpu_read8(status,status->pc+1) & 0x80) == 0)
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = (0x000000FF & cpu_read8(status,status->pc+1));
2022-07-05 19:20:34 +02:00
else
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = (0xFFFFFF00 | cpu_read8(status,status->pc+1));
2022-07-05 19:20:34 +02:00
status->pc += 2;
}
void instruction_movt_r(cpu_status_t* status){
if (status->t == 1)
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = 0x00000001;
else
status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = 0x00000000;
status->pc += 2;
}
void instruction_swapb_r_r(cpu_status_t* status){
int n = status->r[LO_NIBBLE(cpu_read8(status,status->pc))];
int m = status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))];
unsigned long temp0, temp1;
temp0 = status->r[m] & 0xFFFF0000;
temp1 = (status->r[m] & 0x000000FF) << 8;
status->r[n] = (status->r[m] & 0x0000FF00) >> 8;
status->r[n] = status->r[n] | temp1 | temp0;
status->pc += 2;
2022-07-05 19:20:34 +02:00
}