// toma un perro ya existente libre y lo recicla seteando x e y a la cucha. // luego inicializa su mapeo de memoria, tss, lo agrega al sched y pinta la pantalla void game_perro_reciclar_y_lanzar(perro_t *perro, uint tipo) { jugador_t *j = perro->jugador; perro->x = j->x_cucha; perro->y = j->y_cucha; perro->tipo = tipo; perro->libre = FALSE; // ahora debo llamar a rutinas que inicialicen un nuevo mapa de // memoria para el nuevo perro, que carguen su tss correspondiente, // lo scheduleen y finalmente lo pinten en pantalla //inicializa memoria int cr3 = mmu_inicializar_memoria_perro(perro, j->index, tipo); perro->cr3 = cr3; //pinta al perro screen_pintar_perro(perro); //agrega la tarea al scheduler sched_agregar_tarea(perro); //TODO: que onda la TSS, hay que cambiar la direccion de la tarea ??? // ~~~ completar ~~~ }
void tss_inicializar_perro(tss* tss_perro, perro_t* perro) { tss_perro->cs = SEG_CODE_USER; tss_perro->ds = SEG_DATA_USER; tss_perro->ss = SEG_DATA_USER; tss_perro->eip = CODIGO_BASE; tss_perro->ebp = TASK_PILA_BASE; tss_perro->esp = TASK_PILA_BASE; tss_perro->cr3 = mmu_inicializar_memoria_perro(perro, perro->jugador->index, perro->tipo); tss_perro->eflags = 0x202; tss_perro->esp0 = mmu_proxima_pagina_fisica_libre() + PAGE_SIZE - 1; tss_perro->ss0 = SEG_DATA_KERNEL; tss_perro->iomap = 0xFFFF; }