push
This commit is contained in:
90
srcs/srcs_vm/cw_ops_tools.c
Normal file
90
srcs/srcs_vm/cw_ops_tools.c
Normal file
@@ -0,0 +1,90 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* cw_ops_tools.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: tmaze <tmaze@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2019/07/09 13:54:26 by tmaze #+# #+# */
|
||||
/* Updated: 2019/07/15 23:52:08 by tmaze ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "corewar.h"
|
||||
|
||||
unsigned int l2b_endian(unsigned int num)
|
||||
{
|
||||
uint32_t b0;
|
||||
uint32_t b1;
|
||||
uint32_t b2;
|
||||
uint32_t b3;
|
||||
uint32_t res;
|
||||
|
||||
b0 = (num & 0x000000ff) << 24u;
|
||||
b1 = (num & 0x0000ff00) << 8u;
|
||||
b2 = (num & 0x00ff0000) >> 8u;
|
||||
b3 = (num & 0xff000000) >> 24u;
|
||||
res = b0 | b1 | b2 | b3;
|
||||
return (res);
|
||||
}
|
||||
|
||||
void init_args(t_args *ag, t_process *p, t_vm *vm)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = -1;
|
||||
while (++i < 4)
|
||||
{
|
||||
ag[i].t = 0;
|
||||
ag[i].i = 0;
|
||||
}
|
||||
ag[3].t = read_mem(vm, p->pc + 1);
|
||||
}
|
||||
|
||||
int check_reg(t_vm *vm, int ind)
|
||||
{
|
||||
int reg;
|
||||
|
||||
reg = read_mem(vm, ind);
|
||||
return ((reg > 0 && reg <= REG_NUMBER) ? reg : 0);
|
||||
}
|
||||
|
||||
void cw_move_pc(t_vm *vm, t_process *p, int jp)
|
||||
{
|
||||
if (vm->verb != -1 && vm->verb & VB_PC)
|
||||
ft_printf("ADV %d (0x%04x -> 0x%04x)", jp, p->pc, p->pc + jp);
|
||||
p->pc = (p->pc + jp) % MEM_SIZE;
|
||||
while (jp && vm->verb != -1 && vm->verb & VB_PC)
|
||||
ft_printf(" %02x", vm->mem[((unsigned)(p->pc - jp--)) % MEM_SIZE]);
|
||||
if (vm->verb != -1 && vm->verb & VB_PC)
|
||||
ft_printf(" \n");
|
||||
}
|
||||
|
||||
int cw_ocp(char nb_ag, t_args *ag, char size_dir)
|
||||
{
|
||||
int res;
|
||||
int i;
|
||||
|
||||
res = 2;
|
||||
i = -1;
|
||||
while (++i < nb_ag)
|
||||
{
|
||||
ag[i].i = res;
|
||||
if (((ag[3].t & (0xC0 >> (2 * i))) >> (2 * (3 - i))) == IND_CODE)
|
||||
{
|
||||
res += 2;
|
||||
ag[i].t = IND_CODE;
|
||||
}
|
||||
else if (((ag[3].t & (0xC0 >> (2 * i))) >> (2 * (3 - i))) == REG_CODE)
|
||||
{
|
||||
res += 1;
|
||||
ag[i].t = REG_CODE;
|
||||
}
|
||||
else if (((ag[3].t & (0xC0 >> (2 * i))) >> (2 * (3 - i))) == DIR_CODE)
|
||||
{
|
||||
res += size_dir;
|
||||
ag[i].t = DIR_CODE;
|
||||
}
|
||||
}
|
||||
return (res);
|
||||
}
|
||||
Reference in New Issue
Block a user