Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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);
    }