static int get_second_arg(t_champion *champion, unsigned char **arena, char codage) { int i; char tmp[4]; tmp[0] = 0; tmp[1] = 0; if ((IS_REGISTER((codage << 2))) == 1) { if ((*arena)[champion->pc] <= REG_NUMBER) i = champion->reg[(*arena)[champion->pc]]; champion->pc = (champion->pc + 1) % MEM_SIZE; } else if ((IS_DIRECT((codage << 2))) == 1) { tmp[2] = (*arena)[champion->pc]; tmp[3] = (*arena)[(champion->pc + 1) % MEM_SIZE]; i = SWAP_ENDIAN(*(int*)tmp); champion->pc = (champion->pc + 2) % MEM_SIZE; } else if ((IS_INDIRECT((codage << 2))) == 1) i = my_ind(champion, arena, codage); return (i); }
static int my_ind(t_champion *champion, unsigned char **arena, char codage) { int i; int j; char tmp[4]; j = 4; tmp[2] = (*arena)[champion->pc]; tmp[3] = (*arena)[(champion->pc + 1) % MEM_SIZE]; tmp[0] = 0; tmp[1] = 0; i = SWAP_ENDIAN(*(int*)tmp); i = i + ((IS_REGISTER(codage << 4)) == 1 ? 3 : 4); while (--j >= 0) tmp[j] = (*arena)[(champion->pc + (i++ % IDX_MOD)) % MEM_SIZE]; i = (*(int*)tmp); champion->pc = (champion->pc + 2) % MEM_SIZE; return (i); }
static int _reg_parm (sym_link * l, bool reentrant) { if (options.noRegParams) { return FALSE; } else { if (!IS_REGISTER(l) || getSize(l) > 2) { return FALSE; } if (_G.regParams == 2) { return FALSE; } else { _G.regParams++; return TRUE; } } }