int game() { int menu = 0; load_cards(); load_menu(); if ((irq_set = keyboard_subscribe_int()) == 1) { vg_exit(); return 1; } while (menu == 0) { if (keyboard_int_handler(irq_set) == 0) { if (scancode == 0x82) { menu = 1; vg_fill(0xff); vg_draw("/usr/src/drivers/proj/images/image_nivel3.mg", 64, 167, 428, 36); vg_draw_all(&d1, 134, 180); vg_draw("/usr/src/drivers/proj/images/image_selected.mg", d1.cards[0]->height, d1.cards[0]->width, d1.posx[0], d1.posy[0]); } else { if (scancode == 0x83) { vg_exit(); return 0; } } } } while (game_over == 0) { if (keyboard_int_handler(irq_set) == 0) { game_handling(&d1); } } if (keyboard_unsubscribe_int() != 0) { return 1; } sleep(5); vg_exit(); return 0; }
int racinix_dispatcher() { unsigned rtc_hook_id = RTC_HOOK_BIT; if (rtc_subscribe_int(&rtc_hook_id, false, true, false) < 0) { return 1; } unsigned long seed = racinix_generate_seed(); srand(seed); if (racinix_rtc_reprogram_alarm()) { return 1; } unsigned mouse_hook_id = MOUSE_HOOK_BIT; if (mouse_subscribe_int(&mouse_hook_id) == -1) { return 1; } if (mouse_set_stream_mode(MOUSE_NUM_TRIES)) { return 1; } if (mouse_enable_stream_mode(MOUSE_NUM_TRIES)) { return 1; } mouse_discard_interrupts(MOUSE_NUM_TRIES, MOUSE_HOOK_BIT); if (keyboard_subscribe_int() == -1) { return 1; } unsigned char timer_hook_bit; if ((timer_hook_bit = timer_subscribe_int()) < 0) { return 1; } unsigned serial_hook_id = SERIAL_HOOK_BIT; if (serial_subscribe_int(&serial_hook_id, RACINIX_SERIAL_PORT_NUMBER, RACINIX_SERIAL_TRIGGER_LEVEL) == -1) { return 1; } if (serial_set(RACINIX_SERIAL_PORT_NUMBER, RACINIX_SERIAL_NUM_BITS, RACINIX_SERIAL_NUM_STOP_BITS, RACINIX_SERIAL_PARITY, RACINIX_SERIAL_BAUD_RATE)) { return 1; } mouse_data_packet_t old_mouse_data_packet, new_mouse_data_packet; old_mouse_data_packet.left_button = old_mouse_data_packet.middle_button = old_mouse_data_packet.right_button = false; int r, ipc_status; unsigned fps_counter; message msg; key_t key; while(1) // Main loop { // Get a request message. if ((r = driver_receive(ANY, &msg, &ipc_status)) != 0) { // Driver receive fail continue; } if (is_ipc_notify(ipc_status)) { // received notification if (_ENDPOINT_P(msg.m_source) == HARDWARE) // hardware interrupt notification { // Keyboard if (msg.NOTIFY_ARG & BIT(KEYBOARD_HOOK_BIT)) { if ((key = racinix_keyboard_int_handler()) == -1) { return 1; } if (racinix_event_handler(RACINIX_EVENT_KEYSTROKE, kbd_keys[key].makecode, kbd_keys[key].pressed) == -1) { break; } } // Timer if (msg.NOTIFY_ARG & BIT(timer_hook_bit)) { if (racinix_serial_int_handler()) // Sometimes VMWare stops sending interrupts for no reason... { return 1; } if ((fps_counter = racinix_timer_int_handler()) != -1) { if (racinix_event_handler(RACINIX_EVENT_NEW_FRAME, fps_counter) == RACINIX_STATE_END) { break; } } } // Mouse if (msg.NOTIFY_ARG & BIT(MOUSE_HOOK_BIT)) { if (racinix_mouse_int_handler(&new_mouse_data_packet) == 0) // Packet ready { if (racinix_event_handler(RACINIX_EVENT_MOUSE_MOVEMENT, &new_mouse_data_packet) == RACINIX_STATE_END) { break; } if (new_mouse_data_packet.left_button != old_mouse_data_packet.left_button) { if (racinix_event_handler(RACINIX_EVENT_MOUSE_LEFT_BTN, new_mouse_data_packet.left_button) == RACINIX_STATE_END) { break; } } if (new_mouse_data_packet.right_button != old_mouse_data_packet.right_button) { if (racinix_event_handler(RACINIX_EVENT_MOUSE_RIGHT_BTN, new_mouse_data_packet.right_button) == RACINIX_STATE_END) { break; } } old_mouse_data_packet = new_mouse_data_packet; } } // Serial port if (msg.NOTIFY_ARG & BIT(SERIAL_HOOK_BIT)) { if (racinix_serial_int_handler()) { break; } } // RTC if (msg.NOTIFY_ARG & BIT(RTC_HOOK_BIT)) { if (racinix_rtc_int_handler()) { break; } } } } } timer_unsubscribe_int(); keyboard_unsubscribe_int(); mouse_disable_stream_mode(MOUSE_NUM_TRIES); mouse_unsubscribe_int(mouse_hook_id); rtc_unsubscribe_int(rtc_hook_id); return 0; }