41,323 out_sb

This file was deleted.

49,189 out_zaz

This file was deleted.

@@ -6,17 +6,14 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/27 10:45:42 by sbenning #+# #+# */
/* Updated: 2017/04/19 19:49:23 by sbenning ### ########.fr */
/* Updated: 2017/04/20 10:12:44 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

#include "vm.h"

int vm_finish(t_vm *vm)
{
if (vm_check_dump(vm))
return (1);
vm_check_step(vm);
if (vm_check_cycle(vm))
return (0);
vm_check_process(vm);
@@ -35,13 +32,16 @@ void vm_loop(t_vm *vm)
vm_put_players(vm);
while (42)
{
if (vm_finish(vm))
break ;
if (vm_check_dump(vm))
break ;
vm_check_step(vm);
vm->config.cycle += 1;
vm->config.cycle_tot += 1;
if (ISBIT(vm->config.verb, VM_CYCLE_VERB))
vm_declare_cycle(vm);
vm_play_process(vm);
if (vm_finish(vm))
break ;
}
}

@@ -6,7 +6,7 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/19 15:14:03 by sbenning #+# #+# */
/* Updated: 2017/04/19 18:28:07 by sbenning ### ########.fr */
/* Updated: 2017/04/20 11:45:51 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

@@ -235,12 +235,12 @@ unsigned char make_ocp(t_op op)
return (ocp);
}

void vm_read_instruction(t_vm *vm, int pc, t_instruction *ins)
void vm_read_instruction(t_vm *vm, int pc, t_instruction *ins, unsigned char opcode)
{
int op_index;

ins->pc = pc;
ins->op = bin_access(vm, pc);
ins->op = opcode;
pc = vm_pc(vm, pc + 1);
ins->size = 1;
op_index = get_op_index(ins->op);
@@ -257,10 +257,20 @@ void vm_read_instruction(t_vm *vm, int pc, t_instruction *ins)
fill_args(ins, vm, pc, g_op[op_index].label_size);
}

int access_reg_arg(t_insarg_i *arg, t_process *p)
int check_reg_index(t_vm *vm, int i)
{
if (i < 1 || i > vm->gconfig.reg_number)
return (-1);
return (0);
}

int access_reg_arg(t_insarg_i *arg, t_process *p, int *err)
{
if (arg->value < 1 || arg->value > 16)
{
*err = 1;
return (0);
}
return (p->registre[arg->value]);
}

@@ -277,10 +287,11 @@ int access_ind_arg(t_insarg_i *arg, t_vm *vm, t_process *p)
return (read_int(vm, &pc));
}

int access_arg_value(t_insarg_i *arg, t_vm *vm, t_process *p)
int access_arg_value(t_insarg_i *arg, t_vm *vm, t_process *p, int *err)
{
*err = 0;
if (arg->type == reg_arg)
return (access_reg_arg(arg, p));
return (access_reg_arg(arg, p, err));
else if (arg->type == dir_arg)
return (access_dir_arg(arg));
return (access_ind_arg(arg, vm, p));
@@ -6,7 +6,7 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/13 14:36:06 by sbenning #+# #+# */
/* Updated: 2017/04/19 16:44:31 by sbenning ### ########.fr */
/* Updated: 2017/04/20 09:58:47 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

@@ -36,15 +36,21 @@ void vm_handler_opcode_add(t_vm *vm, t_process *p, t_instruction *ins)
int i_op1;
int i_op2;

vm_put_instruction(vm, p, ins);
i_op1 = ins->args[0].value;
i_op2 = ins->args[1].value;
i_res = ins->args[2].value;
if (check_reg_index(vm, i_op1) || check_reg_index(vm, i_op2) || check_reg_index(vm, i_res))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[i_res] = p->registre[i_op1] + p->registre[i_op2];
if (!p->registre[i_res])
p->carry = 1;
else
p->carry = 0;
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -55,15 +61,21 @@ void vm_handler_opcode_sub(t_vm *vm, t_process *p, t_instruction *ins)
int i_op1;
int i_op2;

vm_put_instruction(vm, p, ins);
i_op1 = ins->args[0].value;
i_op2 = ins->args[1].value;
i_res = ins->args[2].value;
if (check_reg_index(vm, i_op1) || check_reg_index(vm, i_op2) || check_reg_index(vm, i_res))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[i_res] = p->registre[i_op1] - p->registre[i_op2];
if (!p->registre[i_res])
p->carry = 1;
else
p->carry = 0;
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -72,10 +84,16 @@ void vm_handler_opcode_aff(t_vm *vm, t_process *p, t_instruction *ins)
{
int index;

vm_put_instruction(vm, p, ins);
index = ins->args[0].value;
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
if (vm->config.aff > 0)
ft_printf("%c", p->registre[index] % 256);
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -84,9 +102,9 @@ void vm_handler_opcode_zjmp(t_vm *vm, t_process *p, t_instruction *ins)
{
int offset;

vm_put_instruction(vm, p, ins);
offset = ins->args[0].value;
offset %= vm->gconfig.idx_mod;
vm_put_instruction(vm, p, ins);
if (p->carry)
{
vm_put_pc_move(vm, p->pc, offset, ins);
@@ -6,7 +6,7 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/13 14:55:51 by sbenning #+# #+# */
/* Updated: 2017/04/19 16:49:57 by sbenning ### ########.fr */
/* Updated: 2017/04/20 09:57:57 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

@@ -17,16 +17,29 @@ void vm_handler_opcode_and(t_vm *vm, t_process *p, t_instruction *ins)
int op1;
int op2;
int index;
int err;

vm_put_instruction(vm, p, ins);
index = ins->args[2].value;
op1 = access_arg_value(ins->args, vm, p);
op2 = access_arg_value(ins->args + 1, vm, p);
op1 = access_arg_value(ins->args, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
op2 = access_arg_value(ins->args + 1, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[index] = op1 & op2;
if (!p->registre[index])
p->carry = 1;
else
p->carry = 0;
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -36,16 +49,35 @@ void vm_handler_opcode_or(t_vm *vm, t_process *p, t_instruction *ins)
int op1;
int op2;
int index;
int err;

vm_put_instruction(vm, p, ins);
index = ins->args[2].value;
op1 = access_arg_value(ins->args, vm, p);
op2 = access_arg_value(ins->args + 1, vm, p);
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
op1 = access_arg_value(ins->args, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
op2 = access_arg_value(ins->args + 1, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[index] = op1 | op2;
if (!p->registre[index])
p->carry = 1;
else
p->carry = 0;
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -55,16 +87,35 @@ void vm_handler_opcode_xor(t_vm *vm, t_process *p, t_instruction *ins)
int op1;
int op2;
int index;
int err;

vm_put_instruction(vm, p, ins);
index = ins->args[2].value;
op1 = access_arg_value(ins->args, vm, p);
op2 = access_arg_value(ins->args + 1, vm, p);
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
op1 = access_arg_value(ins->args, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
op2 = access_arg_value(ins->args + 1, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[index] = ((op1 & ~op2) | (~op1 & op2));
if (!p->registre[index])
p->carry = 1;
else
p->carry = 0;
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -6,23 +6,38 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/13 14:56:52 by sbenning #+# #+# */
/* Updated: 2017/04/19 18:28:07 by sbenning ### ########.fr */
/* Updated: 2017/04/20 09:58:47 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

#include "vm.h"

void vm_handler_opcode_ld(t_vm *vm, t_process *p, t_instruction *ins)
{
int value;
int index;
int err;

vm_put_instruction(vm, p, ins);
index = ins->args[1].value;
p->registre[index] = access_arg_value(ins->args, vm, p);
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
value = access_arg_value(ins->args, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[index] = value;
if (!p->registre[index])
p->carry = 1;
else
p->carry = 0;
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -33,22 +48,33 @@ void vm_handler_opcode_st(t_vm *vm, t_process *p, t_instruction *ins)
int index;
int offset;
int value;
int err;

vm_put_instruction(vm, p, ins);
value = access_arg_value(ins->args, vm, p);
value = access_arg_value(ins->args, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
if (ins->args[1].type == reg_arg)
{
index = ins->args[1].value;
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
p->registre[index] = value;
}
else if (ins->args[1].type == ind_arg)
{
offset = ins->args[1].value % vm->gconfig.idx_mod;
pc = vm_pc(vm, p->pc + offset);
if (pc == 0x0188)
ft_printf("ST WANT TO WRITE %d AT pc %d from %d\n", value, pc, ins->args[0].type);
write_int(vm, &pc, value);
}
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -59,13 +85,32 @@ void vm_handler_opcode_ldi(t_vm *vm, t_process *p, t_instruction *ins)
int index;
int addr;
int offset;
int err;

vm_put_instruction(vm, p, ins);
index = ins->args[2].value;
addr = access_arg_value(ins->args, vm, p);
offset = access_arg_value(ins->args + 1, vm, p);
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
addr = access_arg_value(ins->args, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
offset = access_arg_value(ins->args + 1, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
pc = vm_pc(vm, p->pc + ((addr + offset) % vm->gconfig.idx_mod));
p->registre[index] = read_int(vm, &pc);
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -77,14 +122,33 @@ void vm_handler_opcode_sti(t_vm *vm, t_process *p, t_instruction *ins)
int addr;
int offset;
int value;
int err;

vm_put_instruction(vm, p, ins);
index = ins->args[0].value;
if (check_reg_index(vm, index))
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
value = p->registre[index];
addr = access_arg_value(ins->args + 1, vm, p);
offset = access_arg_value(ins->args + 2, vm, p);
addr = access_arg_value(ins->args + 1, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
offset = access_arg_value(ins->args + 2, vm, p, &err);
if (err)
{
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
return ;
}
pc = vm_pc(vm, p->pc + ((addr + offset) % vm->gconfig.idx_mod));
write_int(vm, &pc, value);
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -94,10 +158,10 @@ void vm_handler_opcode_fork(t_vm *vm, t_process *p, t_instruction *ins)
int offset;
int pc;

vm_put_instruction(vm, p, ins);
offset = ins->args[0].value % vm->gconfig.mem_size;
pc = vm_pc(vm, p->pc + offset);
vm_new_fprocess(vm, pc, p);
vm_put_instruction(vm, p, ins);
vm_put_pc_move(vm, p->pc, ins->size, ins);
p->pc = vm_pc(vm, p->pc + ins->size);
}
@@ -18,7 +18,6 @@ void vm_new_process\
process.player_id = id;
process.color = color;
process.pc = pc;
process.registre[0] = pc;
process.registre[1] = id;
vm_set_timer(vm, &process);
if (!(l = ft_lstnew(&process, sizeof(t_process))))
@@ -38,6 +37,8 @@ void vm_new_fprocess\
process.player_id = p->player_id;
process.color = p->color;
process.pc = pc;
process.carry = p->carry;
process.live = p->live;
process.registre[0] = 0;
i = 0;
while (++i < 17)
@@ -6,7 +6,7 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/10 13:20:49 by sbenning #+# #+# */
/* Updated: 2017/04/19 16:02:32 by sbenning ### ########.fr */
/* Updated: 2017/04/20 11:45:51 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

@@ -62,7 +62,7 @@ static void vm_play_process_i(t_vm *vm, t_process *process)
return ;
}
ft_bzero(&ins, sizeof(t_instruction));
vm_read_instruction(vm, process->pc, &ins);
vm_read_instruction(vm, process->pc, &ins, process->opcode);
dispatch(ins.op)(vm, process, &ins);
vm_set_timer(vm, process);
}
@@ -6,7 +6,7 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/13 08:45:42 by sbenning #+# #+# */
/* Updated: 2017/04/19 16:52:06 by sbenning ### ########.fr */
/* Updated: 2017/04/20 10:22:16 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

@@ -18,7 +18,7 @@ void vm_put_pc_move(t_vm *vm, int pc_start, int offset, t_instruction *ins)
{
int i;

if (!ISBIT(vm->config.verb, VM_OP_VERB))
if (!ISBIT(vm->config.verb, VM_PC_VERB))
return ;
ft_printf("ADV %d (0x%04x -> 0x%04x) ", offset, pc_start, vm_pc(vm, pc_start + offset));
i = -1;
@@ -6,7 +6,7 @@
/* By: sbenning <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/04/13 15:32:18 by sbenning #+# #+# */
/* Updated: 2017/04/18 13:20:21 by sbenning ### ########.fr */
/* Updated: 2017/04/20 11:52:30 by sbenning ### ########.fr */
/* */
/* ************************************************************************** */

@@ -22,8 +22,10 @@ void vm_set_timer(t_vm *vm, t_process *p)
if (vm->memory[p->pc] == g_op[i].opcode)
{
p->timer = g_op[i].cycle;
p->opcode = g_op[i].opcode;
return ;
}
}
p->timer = 0;
p->opcode = 0;
}
BIN +221 Bytes (110%) test.cor
Binary file not shown.
39 test.s
@@ -1,8 +1,41 @@
#by zaz, still not as good as rainbowdash though
#2013

.name "helltrain"
.comment "choo-choo, motherf*****s !"
.name "TEST"
.comment "test each instruction"

live %42
live %42
ld %42, r2
ld 42, r2
st r2, r3
st r2, 42
add r2, r3, r4
sub r2, r3, r4
and r2, r3, r4
and %42, %42, r2
and 42, 42, r2
and r3, %42, r2
and 42, r3, r2
and 42, %42, r2
or %42, %42, r2
or 42, 42, r2
or r3, %42, r2
or 42, r3, r2
or 42, %42, r2
xor %42, %42, r2
xor 42, 42, r2
xor r3, %42, r2
xor 42, r3, r2
xor 42, %42, r2
zjmp %42
ldi r2, r3, r4
ldi %42, r3, r4
ldi 42, r3, r4
ldi r2, %42, r4
ldi 42, %42, r4
sti r2, r3, r4
sti r2, %42, %42
sti r2, 42, r3
sti r2, %42, %42
sti r2, 42, r3
fork %42
BIN +2.37 KB test_sb.cor
Binary file not shown.
@@ -0,0 +1,41 @@
#by zaz, still not as good as rainbowdash though
#2013

.name "TEST"
.comment "test each instruction"

live %42
ld %42, r2
ld 42, r2
st r2, r3
st r2, 42
add r2, r3, r4
sub r2, r3, r4
and r2, r3, r4
and %42, %42, r2
and 42, 42, r2
and r3, %42, r2
and 42, r3, r2
and 42, %42, r2
or %42, %42, r2
or 42, 42, r2
or r3, %42, r2
or 42, r3, r2
or 42, %42, r2
xor %42, %42, r2
xor 42, 42, r2
xor r3, %42, r2
xor 42, r3, r2
xor 42, %42, r2
zjmp %42
ldi r2, r3, r4
ldi %42, r3, r4
ldi 42, r3, r4
ldi r2, %42, r4
ldi 42, %42, r4
sti r2, r3, r4
sti r2, %42, %42
sti r2, 42, r3
sti r2, %42, %42
sti r2, 42, r3
fork %42