Beispiel #1
0
void		ft_lldi(t_env *env, t_process *proc)
{
	t_list	*params;
	int		value;
	int		op_size;

	op_size = calculate_size(env->arena[proc->pc + 1], 3, 2);
	params = get_parameters(env, proc);
	if (count_t_param(params) != 3
			|| va(1, 1, 1, (t_param *)params->content) == -1
			|| va(1, 1, 0, (t_param *)params->next->content) == -1
			|| va(1, 0, 0, (t_param *)params->next->next->content) == -1)
	{
		proc->pc = ft_mod((proc->pc + op_size + 2) % MEM_SIZE);
		ft_free(params);
		return ;
	}
	value = ft_getnumber(env->arena, proc->pc
				+ (((t_param *)params->content)->real_value
				+ ((t_param *)params->next->content)->real_value), 4);
	proc->reg[((t_param *)params->next->next->content)->value - 1] = value;
	if (env->flags->v && env->flags->verbose->show_operations)
		verb_lldi(params, proc);
	proc->pc = ft_mod((proc->pc + op_size + 2) % MEM_SIZE);
	proc->carry = (value == 0) ? 1 : 0;
	ft_free(params);
}
Beispiel #2
0
void			ft_ld(t_env *env, t_process *proc)
{
	t_list	*params;
	int		op_size;
	t_param **param;

	params = get_parameters(env, proc);
	op_size = calculate_size(env->arena[(proc->pc + 1) % MEM_SIZE], 2, 4);
	if (!(param = check_params(params)))
	{
		proc->pc = ft_mod((proc->pc + op_size + 2) % MEM_SIZE);
		ft_free(params);
		return ;
	}
	proc->carry = 0;
	if (param[0]->type == IND_CODE)
		proc->reg[param[1]->value - 1] = ft_getnumber(env->arena
			, (proc->pc + param[0]->value % IDX_MOD) % MEM_SIZE, 4);
	else
		proc->reg[param[1]->value - 1] = param[0]->value;
	if (env->flags->v && env->flags->verbose->show_operations)
		verb_ld(proc, param);
	proc->pc = ft_mod((proc->pc + op_size + 2) % MEM_SIZE);
	if (proc->reg[param[1]->value - 1] == 0)
		proc->carry = 1;
	ft_free(params);
	free(param);
}
Beispiel #3
0
static void		verb_sub(t_env *env, t_process *proc)
{
	char	*str;
	int		len;

	str = ft_itoa(proc->num);
	len = ft_strlen(str);
	ft_putchar('P');
	while (5 - len)
	{
		ft_putchar(' ');
		len++;
	}
	ft_putnbr(proc->num);
	ft_putstr(" | sub r");
	ft_putnbr(ft_getnumber(env->arena, proc->pc + 2, 1));
	ft_putstr(" r");
	ft_putnbr(ft_getnumber(env->arena, proc->pc + 3, 1));
	ft_putstr(" r");
	ft_putnbr(ft_getnumber(env->arena, proc->pc + 4, 1));
	ft_putchar('\n');
	free(str);
}
Beispiel #4
0
char		*ft_itoa(int n)
{
	int		i;
	int		nb;
	char	*number;

	nb = ft_getnumber(n);
	if ((number = ft_strnew(nb + 1)) == NULL)
		return (NULL);
	if (n == -2147483648)
		return (number = "-2147483648");
	if (n < 0)
		number[0] = '-';
	i = 0;
	while (i < nb)
	{
		if (number[nb - i - 1] == '-')
			break ;
		number[nb - i - 1] = ABS(n) % 10 + 48;
		n = n / 10;
		i++;
	}
	return (number);
}