tuxanci2-engine
Game engine for tuxanci2
Log | Files | Refs | README | LICENSE

vm.h (1803B)


      1 #ifndef TA_VM_H
      2 #define TA_VM_H
      3 
      4 #include <stdint.h>
      5 #include <stdbool.h>
      6 #include <stddef.h>
      7 
      8 typedef enum {
      9 	TA_VM_RUNNING,
     10 	TA_VM_HALTED,
     11 	TA_VM_YIELDED,
     12 	TA_VM_FAULT_ILLEGAL,
     13 	TA_VM_FAULT_MEMORY,
     14 	TA_VM_FAULT_MISALIGNED,
     15 	TA_VM_FAULT_EBREAK
     16 } ta_vm_status;
     17 
     18 typedef struct ta_vm ta_vm;
     19 typedef ta_vm_status (*ta_vm_ecall)(ta_vm *vm, void *user);
     20 
     21 struct ta_vm {
     22 	uint32_t regs[32];
     23 	uint32_t pc;
     24 	uint8_t *mem;
     25 	uint32_t mem_size;
     26 	ta_vm_ecall ecall;
     27 	void *user;
     28 	uint32_t steps;
     29 };
     30 
     31 #define TA_VM_REG_RA 1
     32 #define TA_VM_REG_SP 2
     33 #define TA_VM_REG_A0 10
     34 #define TA_VM_REG_A1 11
     35 #define TA_VM_REG_A2 12
     36 #define TA_VM_REG_A3 13
     37 #define TA_VM_REG_A4 14
     38 #define TA_VM_REG_A5 15
     39 #define TA_VM_REG_A6 16
     40 #define TA_VM_REG_A7 17
     41 
     42 void ta_vm_init(ta_vm *vm, uint8_t *mem, uint32_t mem_size, ta_vm_ecall ecall, void *user);
     43 void ta_vm_reset(ta_vm *vm, uint32_t entry, uint32_t stack_top);
     44 ta_vm_status ta_vm_run(ta_vm *vm, uint32_t max_steps);
     45 bool ta_vm_read8(const ta_vm *vm, uint32_t addr, uint8_t *out);
     46 bool ta_vm_read32(const ta_vm *vm, uint32_t addr, uint32_t *out);
     47 bool ta_vm_write32(ta_vm *vm, uint32_t addr, uint32_t value);
     48 void *ta_vm_translate_pointer(const ta_vm *vm, uint32_t addr, uint32_t size);
     49 const char *ta_vm_cstr(const ta_vm *vm, uint32_t addr);
     50 
     51 #ifndef TA_VM_RAM_SIZE
     52 #define TA_VM_RAM_SIZE (256u * 1024u)
     53 #endif
     54 
     55 #ifndef TA_VM_STEPS_PER_CALL
     56 #define TA_VM_STEPS_PER_CALL 200000u
     57 #endif
     58 
     59 extern bool ta_vm_running;
     60 
     61 bool ta_vm_load(const uint8_t *binary, size_t size);
     62 bool ta_vm_load_tab(const char *path);
     63 void ta_vm_request_exec(uint8_t file);
     64 bool ta_vm_exec_pending(void);
     65 bool ta_vm_exec_apply(void);
     66 bool ta_vm_call(uint32_t function, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t *result);
     67 int32_t ta_vm_exit_code(void);
     68 void ta_vm_unload(void);
     69 
     70 #endif // TA_VM_H