195 lines
5.4 KiB
C
195 lines
5.4 KiB
C
#include "debug.h"
|
|
|
|
/**
|
|
* Dumps the vm memory to a file.
|
|
*/
|
|
int core_dump(VM *vm) {
|
|
FILE *file = fopen("memory_dump.bin", "wb");
|
|
if (!file) {
|
|
perror("Failed to open file");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
size_t written = fwrite(vm->memory, 1, vm->memory_size, file);
|
|
if (written != vm->memory_size) {
|
|
fprintf(stderr, "Incomplete write: %zu bytes written out of %u\n", written,
|
|
vm->memory_size);
|
|
fclose(file);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
fclose(file);
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
* Print opcode.
|
|
*/
|
|
void printOp(uint8_t op, uint8_t dest, uint8_t src1, uint8_t src2) {
|
|
switch (op) {
|
|
case OP_HALT:
|
|
printf("[HALT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_CALL:
|
|
printf("[CALL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_RETURN:
|
|
printf("[RETURN] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_LOADI:
|
|
printf("[LOADI] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_LOADU:
|
|
printf("[LOADU] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_LOADF:
|
|
printf("[LOADF] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_STOREI:
|
|
printf("[STOREI] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_STOREU:
|
|
printf("[STOREU] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_STOREF:
|
|
printf("[STOREF] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_PUSHI:
|
|
printf("[PUSHI] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_PUSHU:
|
|
printf("[PUSHU] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_PUSHF:
|
|
printf("[PUSHF] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_POPI:
|
|
printf("[POPI] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_POPU:
|
|
printf("[POPU] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_POPF:
|
|
printf("[POPF] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_ADD_INT:
|
|
printf("[ADD_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_SUB_INT:
|
|
printf("[SUB_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_MUL_INT:
|
|
printf("[MUL_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_DIV_INT:
|
|
printf("[DIV_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JEQ_INT:
|
|
printf("[JEQ_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JGT_INT:
|
|
printf("[JGT_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JLT_INT:
|
|
printf("[JLT_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JLE_INT:
|
|
printf("[JLE_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JGE_INT:
|
|
printf("[JGE_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_INT_TO_REAL:
|
|
printf("[INT_TO_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_ADD_UINT:
|
|
printf("[ADD_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_SUB_UINT:
|
|
printf("[SUB_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_MUL_UINT:
|
|
printf("[MUL_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_DIV_UINT:
|
|
printf("[DIV_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JEQ_UINT:
|
|
printf("[JEQ_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JGT_UINT:
|
|
printf("[JGT_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JLT_UINT:
|
|
printf("[JLT_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JLE_UINT:
|
|
printf("[JLE_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JGE_UINT:
|
|
printf("[JGE_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_UINT_TO_REAL:
|
|
printf("[UINT_TO_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_ADD_REAL:
|
|
printf("[ADD_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_SUB_REAL:
|
|
printf("[SUB_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_MUL_REAL:
|
|
printf("[MUL_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_DIV_REAL:
|
|
printf("[DIV_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JEQ_REAL:
|
|
printf("[JEQ_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JGE_REAL:
|
|
printf("[JGE_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JGT_REAL:
|
|
printf("[JGT_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JLT_REAL:
|
|
printf("[JLT_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JLE_REAL:
|
|
printf("[JLE_REAL] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_REAL_TO_INT:
|
|
printf("[REAL_TO_INT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_REAL_TO_UINT:
|
|
printf("[REAL_TO_UINT] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_MOV:
|
|
printf("[MOV] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_JMP:
|
|
printf("[JMP] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_INT_TO_STRING:
|
|
printf("[INT_TO_STRING] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_UINT_TO_STRING:
|
|
printf("[UINT_TO_STRING] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_REAL_TO_STRING:
|
|
printf("[REAL_TO_STRING] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_READ_STRING:
|
|
printf("[READ_STRING] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_PRINT_STRING:
|
|
printf("[PRINT_STRING] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
case OP_CMP_STRING:
|
|
printf("[CMP_STRING] $%d, $%d, $%d\n", dest, src1, src2);
|
|
break;
|
|
}
|
|
}
|
|
|