Esempio n. 1
0
void invokeSelector(EngineState *s, reg_t object, int selectorId,
	int k_argc, StackPtr k_argp, int argc, const reg_t *argv) {
	int i;
	int framesize = 2 + 1 * argc;
	int slc_type;
	StackPtr stackframe = k_argp + k_argc;

	stackframe[0] = make_reg(0, selectorId);  // The selector we want to call
	stackframe[1] = make_reg(0, argc); // Argument count

	slc_type = lookupSelector(s->_segMan, object, selectorId, NULL, NULL);

	if (slc_type == kSelectorNone) {
		error("Selector '%s' of object at %04x:%04x could not be invoked",
		         g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object));
	}
	if (slc_type == kSelectorVariable) {
		error("Attempting to invoke variable selector %s of object %04x:%04x",
			g_sci->getKernel()->getSelectorName(selectorId).c_str(), PRINT_REG(object));
	}

	for (i = 0; i < argc; i++)
		stackframe[2 + i] = argv[i]; // Write each argument

	ExecStack *xstack;

	// Now commit the actual function:
	xstack = send_selector(s, object, object, stackframe, framesize, stackframe);

	xstack->sp += argc + 2;
	xstack->fp += argc + 2;

	run_vm(s); // Start a new vm
}
Esempio n. 2
0
void Display::on_key_down(SDL_KeyboardEvent &e)
{
	switch(e.keysym.sym)
	{
		case SDLK_ESCAPE:
			sdl->quit();
			break;
		case SDLK_PAGEUP:
			if(current != NULL)
				current->display->pageup();
			break;
		case SDLK_PAGEDOWN:
			if(current != NULL)
				current->display->pagedown();
			break;
		case SDLK_RCTRL:
		case SDLK_LCTRL:
			state.key_ctrl = true;
			break;
		default:
			if(cli.display->on_key(e))
				send_selector();
			break;
	}
}
Esempio n. 3
0
void SciEngine::initStackBaseWithSelector(Selector selector) {
	_gamestate->stack_base[0] = make_reg(0, (uint16)selector);
	_gamestate->stack_base[1] = NULL_REG;

	// Register the first element on the execution stack
	if (!send_selector(_gamestate, _gameObjectAddress, _gameObjectAddress, _gamestate->stack_base, 2, _gamestate->stack_base)) {
		_console->printObject(_gameObjectAddress);
		error("initStackBaseWithSelector: error while registering the first selector in the call stack");
	}

}
Esempio n. 4
0
void Display::on_click(SDL_MouseButtonEvent &e)
{
	if(current != NULL)
	{
		//adjust mouse coordinates to that of the selected viewport
		e.x -= current->rect.x;
		e.y -= current->rect.y;
		current->display->on_click(e);
		send_selector();
	}
}
Esempio n. 5
0
void Display::on_text(SDL_TextInputEvent &e)
{
	cli.display->on_text(e);
	send_selector();
}