#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; } }