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); }
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); }
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); }
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); }