uint16_t vm_hook_register(vm_t* vm, vm_hook hook, uint16_t mode, void* ud) { uint16_t id = 0; printd(LEVEL_EVERYTHING, "registering hook\n"); while (vm_hook_list[id] != NULL && id < HOOK_MAX) id++; if (id >= HOOK_MAX) { vm_halt(vm, "unable to register hook, maximum reached!\n"); return 0; } vm_hook_list[id] = hook; vm_hook_mode[id] = mode; vm_hook_userdata[id] = ud; return id; }
uint16_t vm_hw_register(vm_t* vm, hw_t hardware) { uint16_t id = 0; while (vm_hw_connected[id] != 0 && id < HW_MAX) id++; if (id >= HW_MAX) { vm_halt(vm, "unable to register hardware, maximum reached!"); return 0; } printf("assigned id %d: 0x%08X\n", id, hardware.id); vm_hw_connected[id] = 1; vm_hw_list[id] = hardware; return id; }
void vm_op_hwq(vm_t* vm, uint16_t a) { hw_t* queried_device; uint16_t* store_a = vm_internal_get_store(vm, REG_A, POS__); uint16_t* store_b = vm_internal_get_store(vm, REG_B, POS__); uint16_t* store_c = vm_internal_get_store(vm, REG_C, POS__); uint16_t* store_x = vm_internal_get_store(vm, REG_X, POS__); uint16_t* store_y = vm_internal_get_store(vm, REG_Y, POS__); uint16_t val_a = vm_resolve_value(vm, a, POS_A); OP_NUM_CYCLES(4); VM_SKIP_RESET; if (val_a < vm_hw_count(vm)) { queried_device = vm_hw_get_device(vm, val_a); if (queried_device == NULL) { vm_halt(vm, "queried hw is null (%d)", val_a); vm->skip = false; return; } printd(LEVEL_DEBUG, "hwq: index %d %08X\n", val_a, queried_device->id); *store_a = (queried_device->id & 0x0000FFFF) >> 0; *store_b = (queried_device->id & 0xFFFF0000) >> 16; *store_c = queried_device->version; *store_x = (queried_device->manufacturer & 0x0000FFFF) >> 0; *store_y = (queried_device->manufacturer & 0xFFFF0000) >> 16; VM_HOOK_FIRE(store_a); VM_HOOK_FIRE(store_b); VM_HOOK_FIRE(store_c); VM_HOOK_FIRE(store_x); VM_HOOK_FIRE(store_y); }