Corewar-Final/srcs/srcs_vm/cw_add_sub.c
Jeremy FLEURY 748d10f4f3 push
2019-07-17 11:22:24 +02:00

62 lines
2.0 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cw_add_sub.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/06/19 20:48:20 by tmaze #+# #+# */
/* Updated: 2019/07/10 15:12:46 by tmaze ### ########.fr */
/* */
/* ************************************************************************** */
#include "corewar.h"
char cw_math_common(t_vm *vm, t_process *p, t_args *ag, int *res)
{
init_args(ag, p, vm);
res[3] = cw_ocp(3, ag, 4);
if (ag[0].t == REG_CODE && check_reg(vm, p->pc + 2)
&& ag[1].t == REG_CODE && check_reg(vm, p->pc + 3)
&& ag[2].t == REG_CODE && check_reg(vm, p->pc + 4))
{
res[0] = read_mem(vm, p->pc + 2);
res[1] = read_mem(vm, p->pc + 3);
res[2] = read_mem(vm, p->pc + 4);
return (1);
}
return (0);
}
void cw_add(t_process *p, t_vm *vm)
{
t_args ag[4];
int res[4];
if (cw_math_common(vm, p, ag, res))
{
if (vm->args & AG_VERB && vm->verb & VB_OPS)
ft_printf("P %4d | add r%d r%d r%d\n", p->pid, res[0], res[1]
, res[2]);
p->regs[res[2]] = p->regs[res[0]] + p->regs[res[1]];
p->carry = (!p->regs[res[2]]) ? 1 : 0;
}
cw_move_pc(vm, p, res[3]);
}
void cw_sub(t_process *p, t_vm *vm)
{
t_args ag[4];
int res[4];
if (cw_math_common(vm, p, ag, res))
{
if (vm->args & AG_VERB && vm->verb & VB_OPS)
ft_printf("P %4d | sub r%d r%d r%d\n", p->pid, res[0], res[1]
, res[2]);
p->regs[res[2]] = p->regs[res[0]] - p->regs[res[1]];
p->carry = (!p->regs[res[2]]) ? 1 : 0;
}
cw_move_pc(vm, p, res[3]);
}