Merge pull request #13 from patricksjackson/master

Removing redundancy
This commit is contained in:
Joseph 2011-09-04 17:25:17 -07:00
commit d6103eba8d
3 changed files with 45 additions and 81 deletions

View file

@ -17,5 +17,6 @@ tvm_t* tvm_create(char* filename);
void tvm_destroy(tvm_t* vm);
void tvm_run(tvm_t* vm);
void tvm_step(tvm_t* vm, int* instr_idx);
#endif

View file

@ -29,42 +29,47 @@ void tvm_run(tvm_t* vm)
for(;vm->pProgram->instr[*instr_idx] != -0x1; ++(*instr_idx))
{
int *arg0 = vm->pProgram->args[*instr_idx][0], *arg1 = vm->pProgram->args[*instr_idx][1];
switch(vm->pProgram->instr[*instr_idx])
{
/* nop */ case 0x0: break;
/* int */ case 0x1: break;
/* mov */ case 0x2: *arg0 = *arg1; break;
/* push */ case 0x3: stack_push(vm->pMemory, arg0); break;
/* pop */ case 0x4: stack_pop(vm->pMemory, arg0); break;
/* pushf */ case 0x5: stack_push(vm->pMemory, &vm->pMemory->FLAGS); break;
/* popf */ case 0x6: stack_pop(vm->pMemory, arg0); break;
/* inc */ case 0x7: ++(*arg0); break;
/* dec */ case 0x8: --(*arg0); break;
/* add */ case 0x9: *arg0 += *arg1; break;
/* sub */ case 0xA: *arg0 -= *arg1; break;
/* mul */ case 0xB: *arg0 *= *arg1; break;
/* div */ case 0xC: *arg0 /= *arg1; break;
/* mod */ case 0xD: vm->pMemory->remainder = *arg0 % *arg1; break;
/* rem */ case 0xE: *arg0 = vm->pMemory->remainder; break;
/* not */ case 0xF: *arg0 = ~(*arg0); break;
/* xor */ case 0x10: *arg0 ^= *arg1; break;
/* or */ case 0x11: *arg0 |= *arg1; break;
/* and */ case 0x12: *arg0 &= *arg1; break;
/* shl */ case 0x13: *arg0 <<= *arg1; break;
/* shr */ case 0x14: *arg0 >>= *arg1; break;
/* cmp */ case 0x15: vm->pMemory->FLAGS = ((*arg0 == *arg1) | (*arg0 > *arg1) << 1); break;
/* jmp */ case 0x17: stack_push(vm->pMemory, instr_idx);
/* call */ case 0x16: *instr_idx = *arg0 - 1; break;
/* ret */ case 0x18: stack_pop(vm->pMemory, instr_idx);
/* je */ case 0x19: if(vm->pMemory->FLAGS & 0x1) *instr_idx = *arg0 - 1; break;
/* jne */ case 0x1A: if(!(vm->pMemory->FLAGS & 0x1)) *instr_idx = *arg0 - 1; break;
/* jg */ case 0x1B: if(vm->pMemory->FLAGS & 0x2) *instr_idx = *arg0 - 1; break;
/* jge */ case 0x1C: if(vm->pMemory->FLAGS & 0x3) *instr_idx = *arg0 - 1; break;
/* jl */ case 0x1D: if(!(vm->pMemory->FLAGS & 0x3)) *instr_idx = *arg0 - 1; break;
/* jle */ case 0x1E: if(!(vm->pMemory->FLAGS & 0x2)) *instr_idx = *arg0 - 1; break;
/* prn */ case 0x1F: printf("%i\n", *arg0);
};
tvm_step(vm, instr_idx);
}
}
void tvm_step(tvm_t* vm, int* instr_idx)
{
int *arg0 = vm->pProgram->args[*instr_idx][0], *arg1 = vm->pProgram->args[*instr_idx][1];
switch(vm->pProgram->instr[*instr_idx])
{
/* nop */ case 0x0: break;
/* int */ case 0x1: break;
/* mov */ case 0x2: *arg0 = *arg1; break;
/* push */ case 0x3: stack_push(vm->pMemory, arg0); break;
/* pop */ case 0x4: stack_pop(vm->pMemory, arg0); break;
/* pushf */ case 0x5: stack_push(vm->pMemory, &vm->pMemory->FLAGS); break;
/* popf */ case 0x6: stack_pop(vm->pMemory, arg0); break;
/* inc */ case 0x7: ++(*arg0); break;
/* dec */ case 0x8: --(*arg0); break;
/* add */ case 0x9: *arg0 += *arg1; break;
/* sub */ case 0xA: *arg0 -= *arg1; break;
/* mul */ case 0xB: *arg0 *= *arg1; break;
/* div */ case 0xC: *arg0 /= *arg1; break;
/* mod */ case 0xD: vm->pMemory->remainder = *arg0 % *arg1; break;
/* rem */ case 0xE: *arg0 = vm->pMemory->remainder; break;
/* not */ case 0xF: *arg0 = ~(*arg0); break;
/* xor */ case 0x10: *arg0 ^= *arg1; break;
/* or */ case 0x11: *arg0 |= *arg1; break;
/* and */ case 0x12: *arg0 &= *arg1; break;
/* shl */ case 0x13: *arg0 <<= *arg1; break;
/* shr */ case 0x14: *arg0 >>= *arg1; break;
/* cmp */ case 0x15: vm->pMemory->FLAGS = ((*arg0 == *arg1) | (*arg0 > *arg1) << 1); break;
/* jmp */ case 0x17: stack_push(vm->pMemory, instr_idx);
/* call */ case 0x16: *instr_idx = *arg0 - 1; break;
/* ret */ case 0x18: stack_pop(vm->pMemory, instr_idx);
/* je */ case 0x19: if(vm->pMemory->FLAGS & 0x1) *instr_idx = *arg0 - 1; break;
/* jne */ case 0x1A: if(!(vm->pMemory->FLAGS & 0x1)) *instr_idx = *arg0 - 1; break;
/* jg */ case 0x1B: if(vm->pMemory->FLAGS & 0x2) *instr_idx = *arg0 - 1; break;
/* jge */ case 0x1C: if(vm->pMemory->FLAGS & 0x3) *instr_idx = *arg0 - 1; break;
/* jl */ case 0x1D: if(!(vm->pMemory->FLAGS & 0x3)) *instr_idx = *arg0 - 1; break;
/* jle */ case 0x1E: if(!(vm->pMemory->FLAGS & 0x2)) *instr_idx = *arg0 - 1; break;
/* prn */ case 0x1F: printf("%i\n", *arg0);
};
}

View file

@ -44,7 +44,7 @@ void tdb_shell(tvm_t* vm)
case 0x1: retcode = tdb_run(vm, breakpoints, num_breakpoints); break;
case 0x2: breakpoints = realloc(breakpoints, sizeof(tdb_breakpoint_t) * ++num_breakpoints);
breakpoints[num_breakpoints - 1].address = tvm_parse_value(tokens[1]); break;
case 0x3: tdb_step(vm);
case 0x3: tvm_step(vm, &vm->pMemory->registers[0x8].i32);
vm->pMemory->registers[0x8].i32++;
printf("Advancing instruction pointer to %i\n", vm->pMemory->registers[0x8].i32); break;
};
@ -69,55 +69,13 @@ int tdb_run(tvm_t* vm, tdb_breakpoint_t* breakpoints, int num_breakpoints)
for(i = 0; i < num_breakpoints; i++)
if(breakpoints[i].address == *instr_idx) return 1; /* Breakpoint hit */
tdb_step(vm);
tvm_step(vm, instr_idx);
}
return 0;
}
void tdb_step(tvm_t* vm)
{
int* instr_idx = &vm->pMemory->registers[0x8].i32;
int *arg0 = vm->pProgram->args[*instr_idx][0], *arg1 = vm->pProgram->args[*instr_idx][1];
switch(vm->pProgram->instr[*instr_idx])
{
/* nop */ case 0x0: break;
/* int */ case 0x1: break;
/* mov */ case 0x2: *arg0 = *arg1; break;
/* push */ case 0x3: stack_push(vm->pMemory, arg0); break;
/* pop */ case 0x4: stack_pop(vm->pMemory, arg0); break;
/* pushf */ case 0x5: stack_push(vm->pMemory, &vm->pMemory->FLAGS); break;
/* popf */ case 0x6: stack_pop(vm->pMemory, arg0); break;
/* inc */ case 0x7: ++(*arg0); break;
/* dec */ case 0x8: --(*arg0); break;
/* add */ case 0x9: *arg0 += *arg1; break;
/* sub */ case 0xA: *arg0 -= *arg1; break;
/* mul */ case 0xB: *arg0 *= *arg1; break;
/* div */ case 0xC: *arg0 /= *arg1; break;
/* mod */ case 0xD: vm->pMemory->remainder = *arg0 % *arg1; break;
/* rem */ case 0xE: *arg0 = vm->pMemory->remainder; break;
/* not */ case 0xF: *arg0 = ~(*arg0); break;
/* xor */ case 0x10: *arg0 ^= *arg1; break;
/* or */ case 0x11: *arg0 |= *arg1; break;
/* and */ case 0x12: *arg0 &= *arg1; break;
/* shl */ case 0x13: *arg0 <<= *arg1; break;
/* shr */ case 0x14: *arg0 >>= *arg1; break;
/* cmp */ case 0x15: vm->pMemory->FLAGS = ((*arg0 == *arg1) | (*arg0 > *arg1) << 1); break;
/* jmp */ case 0x17: stack_push(vm->pMemory, instr_idx);
/* call */ case 0x16: *instr_idx = *arg0 - 1; break;
/* ret */ case 0x18: stack_pop(vm->pMemory, instr_idx);
/* je */ case 0x19: if(vm->pMemory->FLAGS & 0x1) *instr_idx = *arg0 - 1; break;
/* jne */ case 0x1A: if(!(vm->pMemory->FLAGS & 0x1)) *instr_idx = *arg0 - 1; break;
/* jg */ case 0x1B: if(vm->pMemory->FLAGS & 0x2) *instr_idx = *arg0 - 1; break;
/* jge */ case 0x1C: if(vm->pMemory->FLAGS & 0x3) *instr_idx = *arg0 - 1; break;
/* jl */ case 0x1D: if(!(vm->pMemory->FLAGS & 0x3)) *instr_idx = *arg0 - 1; break;
/* jle */ case 0x1E: if(!(vm->pMemory->FLAGS & 0x2)) *instr_idx = *arg0 - 1; break;
/* prn */ case 0x1F: printf("%i\n", *arg0);
};
}
void tokenize(char* str, char** tokens)
{
int i = 0;