Jeremy FLEURY 748d10f4f3 push
2019-07-17 11:22:24 +02:00

141 lines
3.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* conv_instru.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mdchane <mdchane@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/09 11:56:37 by mdchane #+# #+# */
/* Updated: 2019/07/16 12:44:33 by mdchane ### ########.fr */
/* */
/* ************************************************************************** */
#include "asm.h"
int ft_calc_byte(t_token *tk)
{
char *str_size;
int size;
char *complete;
str_size = ft_strnew(0);
while (tk)
{
if (tk && ft_strcmp(tk->contents, ",") == 0)
tk = tk->next;
if (tk->type == DIRECT || tk->type == DIRECT_LABEL)
str_size = ft_strextend(str_size, "10");
else if (tk->type == INDIRECT || tk->type == INDIRECT_LABEL)
str_size = ft_strextend(str_size, "11");
else if (tk->type == REGISTER)
str_size = ft_strextend(str_size, "01");
tk = tk->next;
}
complete = ft_strnew_1(8 - ft_strlen(str_size));
str_size = ft_strextend(str_size, complete);
size = ft_atoi_bin(str_size);
ft_strdel(&complete);
ft_strdel(&str_size);
return (size);
}
unsigned char *ft_convert_lab(t_token *tk, int inst,
int *size_param, t_pos_lab pos_lab)
{
unsigned char *param;
param = NULL;
if (tk->type == DIRECT_LABEL)
{
*size_param = (g_tab[inst].size) ? 2 : 4;
param = ft_conv_hexa(get_label(tk, pos_lab.lab)->place
- pos_lab.pos, *size_param);
}
else if (tk->type == INDIRECT_LABEL)
{
*size_param = 2;
param = ft_conv_hexa(get_label(tk, pos_lab.lab)->place
- pos_lab.pos, *size_param);
}
return (param);
}
unsigned char *ft_convert_one(t_token *tk, int inst,
int *size_param, t_pos_lab pos_lab)
{
unsigned char *param;
*size_param = 0;
param = NULL;
if (tk->type == DIRECT)
{
*size_param = (g_tab[inst].size) ? 2 : 4;
param = ft_conv_hexa(ft_atoi(tk->contents + 1), *size_param);
}
else if (tk->type == INDIRECT)
{
*size_param = 2;
param = ft_conv_hexa(ft_atoi(tk->contents), *size_param);
}
else if (tk->type == REGISTER)
{
*size_param = 1;
param = ft_conv_hexa(ft_atoi(tk->contents + 1), *size_param);
}
else
param = ft_convert_lab(tk, inst, size_param, pos_lab);
return (param);
}
unsigned char *ft_str_params(t_token *tk, int inst,
int *size_params, t_pos_lab pos_lab)
{
unsigned char *params;
unsigned char *one;
int size_one;
*size_params = 0;
if (!(params = (unsigned char *)malloc(sizeof(*params))))
return (NULL);
while (tk)
{
if (tk && ft_strcmp(tk->contents, ",") == 0)
tk = tk->next;
else if (tk->type == COMMENT)
break ;
one = ft_convert_one(tk, inst, &size_one, pos_lab);
params = ft_strextend_nm(params, one, *size_params, size_one);
tk = tk->next;
*size_params += size_one;
}
return (params);
}
unsigned char *ft_conv_instru(t_token *tk, int *size_instru,
t_pos_lab pos_lab)
{
int inst;
unsigned char *instru;
unsigned char *params;
int size_params;
inst = is_inst(tk->contents);
if (!(instru = (unsigned char *)malloc(sizeof(*instru)
* (1 + g_tab[inst].byte))))
return (NULL);
instru[0] = g_tab[inst].op_code;
params = ft_str_params(tk->next, inst, &size_params, pos_lab);
if (g_tab[inst].byte)
{
instru[1] = ft_calc_byte(tk);
instru = ft_strextend_nm(instru, params, 2, size_params);
*size_instru = 2 + size_params;
}
else
{
instru = ft_strextend_nm(instru, params, 1, size_params);
*size_instru = 1 + size_params;
}
return (instru);
}